python基础之*args
和**kwargs
简单介绍
认识 *args和 **kwargs
首先,看看*args
和**kwargs
到底是个什么:
代码示例:
1 | def foo(*args, **kwargs): |
输出结果为:
1 | args = (1, 2, 3, 4) |
可以看出,这俩其实就是python的两个变量,*args
是个元组(tuple),**kwargs
是个字典(dictionary)。
原理
通过google各种解释,差不多是理解了,其实*args
和**kwargs
真正起作用的是*
和**
,而args
以及kwargs
其实就类似于var
和vars
;当python需要传递多个参数时,就将参数放在一个元组里,按照参数位置传递,以*
开头;当需要传递多个键值对时,就把这些键值对放在一个字典里,按照关键字传递,以**
开头。
示例一:
1 | def foo(x, *args): |
输出结果:
1 | 1 |
可以看出,python将(1,2,3,4),其中1,赋给默认参数x,(2,3,4)作为一个元组赋给args;
示例二:
1 | def foo(x, **kwargs): |
输出结果:
1 | 1 |
python将(1, a=2, b=3, c=4),其中1,赋值给默认参数x;(a=2, b=3, c=4)作为字典赋给kwargs。
实参角度
或者从实参角度来理解:*args
示例:
1 | def foo(x, y, z): |
输出结果:
1 | 1 |
可以看出python将*(1, 2, 3)
,按照位置将值赋给了x, y, z;
**kwargs
示例:
1 | def foo(x, y, z): |
输出结果:
1 | 1 |
python将**{"x":1,"y":2,"z":3}
,按照关键字x,y,z
赋值给了x,y,z。
*args
其实可以理解为python需要调用的任意个没有关键字的参数(无名参数)组成的元组,
称之为Non-keyword Variable Arguments;**kwargs
是python需要调用的任意个关键字参数(键值对)组成的字典,
称之为keyword Variable Arguments
注意事项
位置参数,*args,**kwargs混合使用顺序
当函数参数中同时拥有位置参数
,*args
以及**kwargs
时,顺序必须是位置参数,*args,**kwargs
,否则会报错。
示例:
1 | def foo(x, *args, **kwargs): |
输出结果:
1 | 1 |
位置参数,默认参数,**kwargs混合使用顺序
当需要同时使用位置参数,默认参数以及**kwargs
时,顺序必须为位置参数,默认参数,**kwargs
,否则会报错。
示例:
1 | def foo(x, y=2, **kwargs): |
输出结果:
1 | 1 |
其中,3将赋给y,替换默认值2。