*args,**kwargs是什么?
其实就是函数的不定参数。定义了这两种参数的函数,可以给它传0到多个参数。
1. *args例子
In [19]: def fun1(*args):
...: print(args)
...:
In [20]: fun1()
In [21]: fun1(1,2,"abc")
1 2 abc
可以看到,*args会取得所有入参。
2. **kwargs 例子
In [30]: fun2(a=1,b=2)
{'a': 1, 'b': 2}
In [31]: fun2(1,3)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-31-0f91f63085a1> in <module>()
----> 1 fun2(1,3)
TypeError: fun2() takes 0 positional arguments but 2 were given
注意看 In [30] 和 In [31]。
区别
发现区别了吗,如果给fun2传fun1那样的参数,解释器会报错:“未定义位置型参数,却收到了两个参数。” 也就是说,kwargs需要的是带名称的参数,而args代表位置型参数(无名称参数)。从英语上来说,kwargs多出来的kw其实就是keyword的意思,表示这是“键值对”参数,就像字典那样。
如果定义一个函数同时定义两种可变参数,那么两种都可以正常获取。如下:
In [32]: def fun3(*args, **kwargs):
...: print(args)
...: print(kwargs)
...:
In [34]: fun3(1,3, a=8,b=9)
(1, 3)
{'a': 8, 'b': 9}