python中函数参数的使用非常灵活,正因为灵活也导致刚接触python会觉得凌乱,搞不清楚。函数无非两种场景,定义和调用。形参是定义函数的时候,实参是调用函数时传给函数的参数。
为了方便自己记忆,现把python函数参数的使用总结如下:
写文章不容易,转载请注明出处。
定义函数:
#情景一:固定个数的形参
def show1(a, b):
print a,b
'''
情景二:任意参数整合之元组,此时表示函数可以接收任意个参数
我们知道,如果定义函数时指定了3个位置参数,都没有默认值,那么,在调用函数的时候,我们必须传递3个值给函数,否则会报错。
show2函数则可以让函数接收任意个参数,包括0个;show3函数可以接收大于等于2个参数。
'''
def show2(*a):
print a
#第一个值和第二个值会自动匹配给形参a和形参b,而多余的参数才会整合成一个元组,即c;注意顺序,下文中有说明。
def show3(a,b,*c):
print a,b,c
#情景三:任意参数整合之字典,字典对应的是关键字参数,注意顺序,下文中有说明。
def show4(**a):
print a
#第一个值和第二个值会自动匹配给形参a和形参b,而多余的参数才会整合成一个字典,即c;注意顺序,下文中有说明。
def show5(a,b,**c):
print a,b,c
#情景四:默认参数,调用函数时传参数量可以少于3个,但只能是少第三个,注意顺序,位置参数必须全部在前面,设置默认值的参数必须全部在后面;注意顺序,下文中有说明。
def show6(a,b,c=0):
print a,b,c
#情景五:混合使用,注意顺序,下文中有说明。
def show7(*a,**b):
print a,b,c
def show8(a, b = 0, *c,**d):
print a,b,c
定义函数时,形参书写顺序:
默认值参数必须在所有不带默认值的参数的后面
------>带星号的参数必须在所有不带星号的参数(包括默认值参数)的后面
------>带两个星号(**)的参数必须在带一个星号(*)的参数的后面;
调用show1函数:
#show1函数专用
vars1 = ["Lily", "Lucy"]
vars2 = {"a": "Lily", "b": "Lucy"}
var1 = "Lily"
var2 = "Lucy"
#调用方法1:常量,位置参数传参,需要注意传参顺序;
show1("Lily", "Lucy")
#调用方法2:变量,位置参数传参,需要注意传参顺序;
show1(var1, var2)
#调用方法3:关键字参数,关键字参数是调用函数时的一种传参方式,且关键字参数的变量名必须跟定义函数时写的形参名称一样,比如,定义函数的时候是形参a/b,那么这里使用关键字就必须使用a/b,而不能使用x/y等其他名称;而默认参数是定义函数时的概念;关键字参数不需要关心传参顺序。
show1(a = "Lily", b = "Lucy")
show1(b = "Lucy", a = "Lily")
show1(a = var1, b = var2)
show1(b = var2, a = var1)
#调用方法4:参数解包之列表传参,对应位置参数,此处参数数量必须跟定义函数的时候指定的一样,否则会报错;
show1(*vars1)
#调用方法5:参数解包之字典传参,对应关键字参数,实参名称必须和形参名称一致,比如形参是a/b,传入的字典keys必须就是a/b,不能是x/y;同时,此处参数数量必须跟定义函数的时候指定的一样,否则会报错;
show1(**vars2)
上述调用执行结果,共8个输出,也就说明是OK的;
调用show2函数和show3函数:
xs = ["Jack", "Lily", "Lucy", "LiLei"]
ys = {"a": "Lily", "b": "Lucy", "c": "LiLei", "d": "Jack"}
w = "Jack"
x = "Lily"
y = "Lucy"
z = "LiLei"
show2(w,x,y,z)
输出:('Jack', 'Lily', 'Lucy', 'LiLei')
show3(w,x,y,z)
输出:Jack Lily ('Lucy', 'LiLei')
show2(*xs)
输出:('Jack', 'Lily', 'Lucy', 'LiLei')
show3(*xs)
输出:Jack Lily ('Lucy', 'LiLei')
show2(**ys)
输出:
字典传参其实利用的关键字参数原理,而show2函数定义的时候,使用的是*a,不存在位置参数a,所以这里会报错;
Traceback (most recent call last):
File "./paras.py", line 42, in <module>
show2(**ys)
TypeError: show2() got an unexpected keyword argument 'a'
show3(**ys)
输出:a,b都正常传参,函数show3没有定义c、d形参;所以这里报错提示没有关键字c。
Traceback (most recent call last):
File "./paras.py", line 42, in <module>
show3(**ys)
TypeError: show3() got an unexpected keyword argument 'c'
小结:
函数show4-show8不再贴图,调用函数时的传参方法都在【调用show1函数】部分,函数定义时的参数写法都包含在上文中。定义函数和调用函数是两个一定程度上相互独立的事情,尤其是函数参数传递赋值尤其如此。