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。