转载自:https://www.cnblogs.com/cwind/p/8996000.html
刚开始学习python的时候,对有关args,kwargs,和*的使用感到很困惑。相信对此感到疑惑的人也有很多。我打算通过这个帖子来排解这个疑惑(希望能减少疑惑)。
让我们通过以下5步来理解:
- 通过一个函数调用来理解’*’的作用
- 通过一个函数的定义来理解’*args’的含义
- 通过一个函数的调用来理解’**’的作用
- 通过一个函数的定义来解’**kwargs’的含义
- 通过一个应用实例来说明’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]。
通过一个函数的定义来理解’*args’的含义
修改函数的定义:
def fun(*args):
print (args)
传一个位置参数调用此函数
fun(13)
(13,)
传多个参数调用此函数
fun(11,93,43)
(11, 93, 43)
*‘args’在函数定义中是做什么用的?
它接收元组作为位置参数,而非是常见的参数列表。在这里,”args”是个元组。在我们解释中不要担心”常见的参数”这部分的理解,这个会在接下来的例子中逐渐明了。在上个例子中,调用函数打印”args”时,他会打印元组中包含的所有数值。
我们重新定义函数,”*args”与”常规参数列表”混合使用
def fun(a, *args):
print ("a is ", a)
print ("args is ", args)
在这个函数定义中,参数”a”代表”常规参数列表”。
传四个位置参数调用此函数:
fun(11,12,34,43)
a is 11
args is (12, 34, 43)
很容易看到,’a’打印出为11,即第一个位置参数。’a’之后只一个参数’*args’.因此,’args’接收除常规参数之外的位置参数作为元组。因此元组args作为元组接收12,34和43。
通过一个函数的调用来理解’’的作用**
定义一个三个参数的函数,并用多种方式调用:
def fun(a, b, c):
print( a, b, c)
fun(1,5,7)
1 5 7
fun(a=1,b=5,c=7)
1 5 7
使用**调用函数,这种方式我们需要一个字典.注意:在函数调用中使用*,我们需要元组;在函数调用中使用**,我们需要一个字典
d={'b':5, 'c':7}
fun(1, **d)
1 5 7
在函数调用中**做了什么?
它unpack字典,并将字典中的数据项作为键值参数传给函数。因此,”fun(1, **d)”的写法与”fun(1, b=5, c=7)”等效.
为了更好的理解再多举几个例子:
>>> d = {'c':3}
>>> fun(1, 4, **d)
1 4 3
>>> d = {'a':7, 'b':3, 'c':8}
>>> fun(**d)
7 3 8
通过函数定义来理解’**kwargs’的含义
重定义函数”fun”:
def fun(a, **kwargs):
print (a, kwargs)
此函数只用一个位置参数,因为常规参数列表中只有一个变量’a’.但是通过”**kwargs”,可以传多个键值参数。
fun(1, b=4, c=5)
1 {'c': 5, 'b': 4}
fun(45, b=6, c=7, d=8)
45 {'c': 7, 'b': 6, 'd': 8}
在函数定义中”**kwargs”意味着什么?
用”**kwargs”定义函数,kwargs接收除常规参数列表职位的键值参数字典。在这里’kwargs’是个字典。
重新定义函数:
def fun(a, **kwargs):
print ("a is ", a)
print ("We expect kwargs 'b' and 'c' in this function")
print ("b is ", kwargs['b'])
print ("c is ", kwargs['c'])
fun(1, b=3,c=5)
a is 1
We expect kwargs 'b' and 'c' in this function
b is 3
c is 5