函数

函数简介
• 函数也是一个对象
• 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
• 函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
定义一个函数
def 函数名([形参1,形参2,形参3....]):
    代码块

你可以定义一个由自己想要功能的函数,以下是简单的规则:
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
注意:
函数名必须符合标识符的规范(可以包含字母、数字、下划线但是不能以数字开头)
print是函数对象  print()是调用函数
函数的参数
形参和实参
• 形参(形式参数) 定义形参就相当于在函数内部声明了变量,但是并不是赋值
• 实参(实际参数)指定了形参,那么在调用函数时必须传递实参,实参将会赋值给对应的形参,简单来说有几个形参就要有几个实参
参数的传递方式
• 定义形参时,可以为形参指定默认值。指定了默认值以后,如果用户传递了参数则默认值不会生效。如果用户没有传递,则默认值就会生效
• 位置参数:位置参数就是将对应位置的实参赋值给对应位置的形参
• 关键字参数 : 关键字参数可以不按照形参定义的顺序去传递,而根据参数名进行传递
• 混合使用位置参数和关键字参数的时候必须将位置参数写到关键字参数前面去
不定长参数
• 定义函数时,可以在形参前面加一个*,这样这个形参可以获取到所有的实参,它会将所有的实参保存到一个元组中
def func(*arg):
    print(arg)

func(1,2,3,4,5)
>>> (1,2,3,4,5)

*arg会把多出来的位置参数转化为tuple
**kwarg会把关键字参数转化为dict

• 带*号的形参只能有一个,可以和其他参数配合使用
• *形参只能接受位置参数,不能接受关键字参数
• **形参可以接收其他的关键字参数,它会将这些参数统一保存到字典当中。字典的key就是参数的名字,字典的value就是参数的值

• **形参只有一个,并且必须写在所有参数的后面
def func(**kwarg):
    print(kwarg)

func(a=1,b=2)
参数的解包
• 传递实参时,也可以在序列类型的参数前添加星号,这样它会自动的将序列中元素依次作为参数传递
def func(a,b,c,d):
    print(a,b,c,d)

list1=[1,2,3,4]
func(*list1)
>>> 1 2 3 4

• 要求序列中的元素的个数必须和形参的个数一致
练习

1、 打印名片程序:输入姓名,电话号码,性别,最后打印出来名片
• 控制姓名长度为6-20
• 电话号码长度11
• 性别只能允许输入男或女
• 每一样信息不允许为空

##### 三个循环分开写
def func1():
    while True:
        name=input('请输入姓名,长度6-20')
        if len(name)>=6 and len(name)<=20 and ' ' not in name:
            break
    while True:
        phone=input('请输入11位电话号码')
        if len(phone)==11 and ' ' not in phone:
            break
    while True:
        gender=input('请输入性别(男或女)')
        if  gender=='男' or gender=='女':
            print('姓名:{}\n电话号码:{}\n性别:{}'.format(name,phone,gender))
            break
                
func1()

##### 循环嵌套结构
def func1():
    num=1   
    while num:
        name=input('请输入姓名,长度6-20')
        if len(name)>=6 and len(name)<=20 and ' ' not in name:
            while num:
                phone=input('请输入11位电话号码')
                if len(phone)==11 and ' ' not in phone:
                    while num:
                        gender=input('请输入性别(男或女)')
                        if  gender=='男' or gender=='女':
                            print('姓名:{}\n电话号码:{}\n性别:{}'.format(name,phone,gender))
                            num=0
    else:
        print('程序结束')
    
func1()

##### 当时写嵌套的时候觉得会出错,结果没有出错
def func1():

    while True:
        name=input('请输入姓名,长度6-20')
        if len(name)>=6 and len(name)<=20 and ' ' not in name:
        
            while True:
                phone=input('请输入11位电话号码')
                if len(phone)==11 and ' ' not in phone:
                
                    while True:
                        gender=input('请输入性别(男或女)')
                        if  gender=='男' or gender=='女':
                            print('姓名:{}\n电话号码:{}\n性别:{}'.format(name,phone,gender))
                            break
                    break
            break   
    else:
        print('程序结束')
               
func1()

2、使用函数根据用户输入求斐波那契数列斐波那契数列:1,1,2,3,5,8,13,21…即: 起始两项均为1,此后的项分别为前两项之和

# 不需要传参,方便用户使用
def func1():
    num=int(input('请输入你要获取的项数'))   
    a=b=1
   
    if num<=2:
        [print(a,end='  ')  for i in range(n)]
    else:
        [print(a,end='  ')  for i in range(2)]
    
    for i in range(num-2):
        print(a+b,end='  ')
        a,b=b,a+b
   
func1()

3、 编写一段代码,定义一个函数求1-100之间所有整数的和,并调用该函数打印出结果

##### for循环
def func1():
    sum=0
    for i in range(1,101):
        sum+=i
    print(sum)

func1()

##### while循环
def func1():
    sum=0
    i =1
    while i <= 100:
        sum+=i
        i+=1
    print(sum)

func1()

本文地址:https://blog.csdn.net/Huangqingmeng/article/details/110438603