刚开始学习python的时候,对有关args,kwargs,和*的使用感到很困惑。相信对此感到疑惑的人也有很多。通过这个帖子给大家来排解这个疑惑(希望能减少疑惑)。
让我们通过以下5步来理解:
1. 通过一个函数调用来理解’*’的作用
2. 通过一个函数的定义来理解’*args’的含义
3. 通过一个函数的调用来理解’**’的作用
4. 通过一个函数的定义来解’**kwargs’的含义
5. 通过一个应用实例来说明’args’,’kwargs’应用场景以及为何要使用它
通过一个函数调用来理解’*’的作用
定义一个含三个位置参数的函数”fun”.
>>> def fun(a,b,c):
... print a,b,c
...
传三个位置参数调用此函数
>>> fun(1,2,3)
1 2 3 #输出
可以看到出入三个位置参数调用此函数,会打印出三个参数
现在我们定义一个含三个整数的数列,并使用’*’
>>> l = [1,2,3]
>>> fun(*l)
1 2 3 #输出
‘*’ 做了什么?
它拆开数列’l’的数值作为位置参数,并吧这些位置参数传给函数’fun’来调用。
因此拆数列、传位置参数意味着fun(*l)与fun(1,2,3)是等效的,因为l = [1,2,3]。
试着数列中使用其他数值
>>> l = [4,8,0]
>>> fun(*l)
4 8 0 #输出
接下来我们试着在数列中放四个数值,调用函数会出现什么情况呢
>>> l = [3,6,9,1]
>>> fun(*l)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: fun() takes exactly 3 arguments (4 given)
在这次调用中我们并没有得到合适的结果,触发了TypeWrror异常。很容易看到错误内容”fun() takes exactly 3 arguments (4 given)”.
为什么会发生这种情况呢?
数列’l’含有四个数值.因此,我们试图调用’fun(*l)’,’l’中数值拆开传给函数fun作为位置参数。但是,’l’中有四个数值,调用’fun(*l)’相当于调用’fun(3,6,9,1)’,又因为函数’fun’定义中只用三个位置参数,因此我们得到这个错误。同理,同样的步骤,数列’l’中有两个数值情况,注意error内容。
>>> l = [7,4]
>>> fun(*l)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: fun() takes exactly 3 arguments (2 given)
‘*l’与位置参数混合使用
>>> fun(23, *l)
23 7 4
在这里,我们给出一个位置参数23,和从数列’l’拆除的两个数值7和4,因此三个参数23,7和4传给了函数’fun’
通过一个函数的定义来理解’*args’的含义
修改函数的定义:
>>&g