[转载] python中*args 和 **kwargs区别

参考链接: 带有* args和** kwargs的Python中的可变长度参数

1 *args 和 **kwargs 定义。 

你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 k 。而写成 *args 和kwargs 只是一个通俗的命名约定。 

2 python函数传递参数的方式有两种: 

位置参数(positional argument) 关键词参数(keyword argument) 

3 *args 与 **kwargs 的区别,两者都是 python 中的可变参数: 

*args 表示任何多个无名参数,它本质是一个 tuple(元组) **kwargs 表示关键字参数,它本质上是一个 dict(字典) 如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。 

4 使用说明 

4.1 *args 

4.1.1 样例一 

>>> def fun(*args):

...     print('args=',args)

...     name = args[0]

...     sex = args[1]

...     mobile = args[2]

...     print('name=',name)

...     print('sex=',sex)

...     print('mobile=',mobile)

...

>>> fun('CleverCode',1,'18612341234','clevercode@qq.com')

('args=', ('CleverCode', 1, '18612341234', 'clevercode@qq.com'))

('name=', 'CleverCode')

('sex=', 1)

('mobile=', '18612341234')

>>>

 

可以看到,我们传递了参数clevercode@qq.com,在args[3]中,但是我们没有使用。 

4.1.2 样例二 

如果把一个元组data变量直接,传递给fun函数,我们可以看到,它只能被当做args[0],也就是说在fun中args[0]=(‘CleverCode’,1,‘18612341234’,‘clevercode@qq.com’)=data。 

>>> def fun(*args):

...     print('args=',args)

...     name = args[0]

...     sex = args[1]

...     mobile = args[2]

...     print('name=',name)

...     print('sex=',sex)

...     print('mobile=',mobile)

...

>>> data=('CleverCode',1,'18612341234','clevercode@qq.com')

>>> fun(data)

('args=', (('CleverCode', 1, '18612341234', 'clevercode@qq.com'),))

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "<stdin>", line 4, in fun

IndexError: tuple index out of range

>>>

 

4.2 **kwargs 

4.2.1 样例一 

kwargs其实也是可变参数的字段,你需要从里面取出每个参数的名字,然后再取值。 

>>> def fun(**kwargs):

...     print('kwargs=',kwargs)

...     name=kwargs['name']

...     sex = kwargs['sex']

...     mobile = kwargs['mobile']

...     print('name=',name)

...     print('sex=',sex)

...     print('mobile=',mobile)

...

>>> fun(name='CleverCode',sex=1,mobile='18612595358',mail='clevercode@qq.com')

('kwargs=', {'mobile': '18612595358', 'mail': 'clevercode@qq.com', 'name': 'CleverCode', 'sex': 1})

('name=', 'CleverCode')

('sex=', 1)

('mobile=', '18612595358')

>>>

 

4.2.2 样例二 

调用**kwargs,函数的时候,调用方必须要给参数取上名字。不能直接把字典传递给调用方。data={},fun(data),这种事错误,因为没有给参数取名字。fun(data=data),这种是正确的,因为给参数取名字了,名字是data,数据是data 

>>> def fun(**kwargs):

...     print('kwargs=',kwargs)

...     name=kwargs['name']

...     sex = kwargs['sex']

...     mobile = kwargs['mobile']

...     print('name=',name)

...     print('sex=',sex)

...     print('mobile=',mobile)

...

>>> data={}

>>> data['name']='CleverCode'

>>> data['sex'] = 1

>>> data['mobile'] = '18612595358'

>>> data['mail'] = 'clevercode@qq.com'

>>> fun(data)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: fun() takes exactly 0 arguments (1 given)

>>> fun(name=data)

('kwargs=', {'name': {'mobile': '18612595358', 'mail': 'clevercode@qq.com', 'name': 'CleverCode', 'sex': 1}})

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "<stdin>", line 4, in fun

KeyError: 'sex'

>>>

 

4.3 *args 与 **kwargs一起用 

如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。 

>>> def fun(*args, **kwargs):

...     print('args=', args)

...     print('kwargs=', kwargs)

...

>>> fun(1, 2, 3, 4, name='CleverCode', sex='1', mobile='18612341234', mail='clevercode@qq.com')

('args=', (1, 2, 3, 4))

('kwargs=', {'mobile': '18612341234', 'mail': 'clevercode@qq.com', 'name': 'CleverCode', 'sex': '1'})

>>>

 

技术交流 

CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值