Python中*args与**kwargs的使用

转载自:https://www.cnblogs.com/cwind/p/8996000.html
刚开始学习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]。

通过一个函数的定义来理解’*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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值