一、函数调用时,实参带有“**”代表了实参是字典,unpack之后传递;实参带有“*”代表了实参是列表,unpack之后传递
函数定义
def myfunc(x, y, z, a):
print(x + y)
1.传递字典:
dict={'x':1,'y':2,'z':3,'a':4}
myfunc(**dict)
3
2.传递列表
list=[1,2,3,4]
myfunc(*list)
3
3.普通传递
myfunc(1,2,3,4)
二、 优先级:F(arg1,arg2,...)> F(arg1,arg2=value2,...agrN=valueN)> F(*arg1)> F(**arg)
函数定义时:形参带有"**",代表了前面的参数赋值之后,再将剩余的键值对存储在"**"定义的形参中,形参带有"*",代表了前面的参数赋值之后,再将剩余的值存储在"*"定义的形参中
函数定义:
def myfunc1(x,y,*z):
print(len(z))
第一次调用:myfunc1(1)
结果:TypeError: myfunc1() missing 1 required positional argument: 'y'
第二次调用:myfunc1(1,2)
结果:0
第三次调用:myfunc1(y=2,1)
结果:SyntaxError: positional argument follows keyword argument
原因:此时程序不知道x的值
第四次调用:myfunc1(1,x=2,1)
结果:SyntaxError: positional argument follows keyword argument
原因:这种显式赋值一般放在最后
第五次调用:myfunc1(1,2,3,4,m=6)
结果:TypeError: myfunc1() got an unexpected keyword argument 'm'
原因:m=6这样的键值对存储不到列表中
函数定义:
def myfun2(x,y,**z):
print(len(z))
第一次调用:myfun2(1,2,3)
结果:TypeError: myfun2() takes 2 positional arguments but 3 were given
第二次调用:myfun2(1,2,z=3)
结果:1
第三次调用:dict={'x':1,'y':2,'z':3,'a':4}
myfun2(1,2,**dict)
结果:myfun2() got multiple values for argument 'x'
原因:因为dict中又指定了x,造成了重复参数指定
第四次调用:dict={'a': 4, 'z': 3}
myfun2(1,2,**dict)
结果:2
第五次调用:list=[1,2,3,4]
myfun2(1,2,*list)
结果:TypeError: myfun2() takes 2 positional arguments but 6 were given
原因:list解压之后参数就多了
函数定义:此时需要显式指明z的值
def myfun4(x,*y,z):
print(x,z,len(y)
第一次调用:myfun4(1,2,3,z=4)
结果:1 4 2
第二次调用:myfun4(1,2,3,4)
结果:TyeError: myfun4() missing 1 required keyword-only argument: 'z'