因为对函数理解的还是有点乱 ,所以在这里总结函数的传递
函数的参数传递是指将实际参数传递给形式参数的过程。
可以具体分为如下几类。
位置参数的传递
函数在被调用时会将实参按照相应的位置依次传递给形参。
def A(name, age, gender):
print(f'{name},{age},{gender}')
A('laoliu', 22, '男')
传递和定义参数的顺序及个数必须一致
关键字参数的传递
关键字的传递是通过“形参=实参”的格式将实参和形参关联,当操作结束,它们之间的关系就消失了
函数调用的时候,如果有位置参数时,位置参数必须在关键字参数的前面,但是关键字参数之间不存在先后顺序。
def A(name, age, gender):
print(f'{name},{age},{gender}')
A('laoliu', age='22', gender='male')
默认参数的传递
在未传入实参时,为形参提供实参,当传入实参,使用传入值
def A(age, gender, name='laosi'):
print(f'{age},{gender},{name}')
A(18, gender='male')
A(18, gender='male', name='laoliu')
参数的打包与解包
函数支持将实参以打包和解包的形式传递给形参。
打包
如果函数在定义是无法确定需要接受多少个数据,那么可以在定义函数时为形参添加“*”或“**”
:如果形参的前面加上“*”,那么他可以接受以元组形式打包的多个值;如果形参的前面加上“**”那么它可以接受以字典形式打包的多个值。
def A(*args):
print(args)
A(12, 13, 14)
def B(**kwargs):
print(kwargs)
B(a=11, b=12, c=13)
如果函数没有接受到任何数据,参数为空,那*args、**kwargs分别为空元组和空字典
解包
如果函数在调用时接受的实参是元组类型的数据,那么可以使用*将元组拆分成多个值,并将元组拆分成多个值,并将每个值按照位置参数传递的方式赋值给形参;如果函数在调用时接受的实参是字典类型的数据,那么可以使用“**”将字典拆分成多个键值对,并将每个只按照关键字参数传递的方式赋值给与键名对应的实参。
def A(a, b, c):
print(a, b, c)
nums = (1, 2, 3)
A(*nums)
absq = {'a': 1, 'b': 2, 'c': 3}
A(**absq)
混合传递
参数传递的方式在定义函数或调用函数时可以混合使用,但是需要遵循一定的优先级规则,这些方式按照优先级,从高到低分别是:
位置参数传递、按关键字参数传递、按默认参数传递、按打包传递
def A(a, b, c=33, *args, **kwargs):
print(a, b, c, args, kwargs)
A(1, 2)
A(1, 2, 3)
A(1, 2, 3, 4)
A(1, 2, 3, 4, d=5)