1.什么是函数:
可重复使用的,用来实现单一,或相关联功能的代码段。
函数分为内置函数和自定义函数,这里先讲自定义函数
2.如何定义函数:
#语法
def函数名(参数1,参数2,参数3,...):'''注释'''函数体return 返回的值
注:函数必须先定义才能使用,定义阶段不执行代码只检测语法.意思就是语法错误在定义阶段就会检测出来,代码的逻辑错误只有在执行时才会提示.
3.定义函数的三种形式
无参:用于执行一些打印等操作,不需要参数传进去
有参:需要根据传进去的参数进行运算
空函数:用于设计代码结构
#1.无参函数#def foo():#print('from foo')#foo()## 2.有参函数#def bar():#print(x,y)#bar(1,2)## 3,空函数#def func():#pass
4.函数调用
函数调用就是函数名加个()即可
4.1调用函数的三种形式:
#1.语句形式#def foo():#print('from foo')#foo()#
#2.表达式形式#def foo(x,y):#res = x+y#return res#res = foo(1,2)
#3.可以当做参数传给另外一个函数#def max2(x,y):#if x>y:#return x#else:#return y#res = max2(max2(1,2),3)#print(res)
4.2函数的返回值
1.返回值没有类型限制
2.返回值没有个数限制
注:返回多个值的结果就是返回一个元组,0个值返回为None
return是函数结束的标准,可以有多个return但只执行一次
#def f1():#print('111')#return 1#print('222')#return 2#print('333')#return 3#def f1()#只执行 print('111')
4.3函数的参数
函数的参数分为形参和实参.形参即为变量名,实参为变量值,在函数调用时,把值绑定到变量名上,在函数调用结束后,解除绑定
形参与实参的具体分类(重点)
1.位置参数
1.1位置形参
在定义函数阶段按照从左到右的顺序定义的形参. 注:按位置定义的形参必须被传值,多一个不行,少一个也不行
#def foo(x,y)#print(x,y)#
#foo(1,2) #正确#foo(1,2,3) #错误
1.2位置实参
在调用函数阶段按照从左到右的顺序依次传入的值.
2.关键字参数
关键字实参:在调用函数阶段,按照key=value的形式指名道姓的为指定值传值
注:可以完全打乱顺序,仍可以为指定的形参传值
可以混合使用位置实参和关键字实参,但必须注意(1)位置实参必须放在关键字实参前面(2)不能对一个形参重复赋值
deffoo(name,age):print(name,age)
foo('zfj',18)
foo(age=18,name='egon')#foo(name='zfj',18)#报错#foo('zfj', age=18)
3.默认参数
指的是在定义阶段就已经为某个形参赋值了,该形参称之为有默认值的形参
注意:1.在定义阶段就已经被赋值,意味着在调用阶段就可以直接使用,默认参数
2.位置形参应该放到默认形参前面
3.默认参数的值,通常应该为不可变类型
def foo(x,y=2):print(x,y)
foo(1)#1,2
foo(1,3)#1,3
4.可变长度参数
站在实参的角度,参数长度可变指的是在调用函数时,传入的实参的值个数不固定
4.1在形参中带“*”:会将调用函数时溢出的位置实参保存为元组的形式,然后赋值给*后的变量
def foo(x,y,*z):print(x,y,z)
foo(1,2,3,4,5)#1 2 (3, 4, 5)
4.2在形参中带“**”:会将调用函数时溢出的关键字实参保存成字典的形式,然后赋值给**后的变量名
def foo(x,y,**z):print(x,y,z)
foo(1,2,a=1,b=2)#1 2 {'a': 1, 'b': 2}
4.3在实参中带“*”:在传值前先被打散成位置实参,然后再进行赋值
def foo(x,y,*z):print(x,y,z)
foo(1,*[2,3,4,5,6])#1 2 (3, 4, 5, 6)
4.4在实参中带“**”:在传值前先被打散成关键字实参,然后再进行赋值
deffoo(x,y,z):print(x,y,z)
foo(1,**{'y':2,'z':1})#1 2 1
5.命名关键字参数
放到*与**之间的参数称为命名关键字参数。函数的调用者可以传入任意不受限制的关键字参数
注意:命名关键字参数必须按照key = value的形式传值
补充:
在形参中带*与**的,*后的变量名应该为args,**后应该是kwargs
#当我们想要将传给一个函数的参数格式原封不动地转嫁给其内部的一个函数,应该使用下面这种格式
defbar(x,y,z):print(x,y,z)def wrapper(*args,**kwargs):
bar(*args,**kwargs)
wrapper(1,2,z=3) #虽然调用的是wrapper,但是要遵循的却是bar的参数标准