参考链接: 带有* 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。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!

[转载] python中*args 和 **kwargs区别相关推荐

  1. python中*args 和 **kwargs区别

    1 *args 和 **kwargs 定义. 你可以将不定数量的参数传递给一个函数.不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字.其实并不是必须写成 ...

  2. python中*args和**kwargs的使用

    文章来源:*Args和**kwargs的使用[重复] - 代码领悟code05.com 提问:python中*args和**kwargs的使用 所以我对*args和**kwargs的概念有困难. 到目 ...

  3. [转载] 【python】Python中*args和**kwargs的区别(在Python中如何使用可变长参数列表)

    参考链接: Python中的*args 和 **kwargs 博客已经搬家到"捕获完成": https://www.v2python.com 或者可以叫做,在Python中如何使用 ...

  4. python 中*args 和 **kwargs的区别

    *args的用法 当你不确定你的函数里将要传递多少参数时你可以用*args.例如,它可以传递任意数量的参数: def print_everything(*args):for count, thing ...

  5. Python中*args和**kwargs的区别

    https://www.cnblogs.com/yunguoxiaoqiao/p/7626992.html (注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正.) 中秋的夜,微凉, ...

  6. python中*args和**kwargs的用法

    args 和 kwargs 不是必须的,* 和 ** 才是必须的 两者都用于对函数进行参数传递,允许传递不定量的参数给函数 1. Overview 如果对各位同学这两个参数知道的很少,那不妨先输出一下 ...

  7. Python中*args 和**kwargs的用法探讨

    当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值.不确定的意思可以是有,有几个,也可以是没有 *args可以当作可容纳多个变量组成的l ...

  8. Python中*args 和**kwargs的用法

    刚开始学习python的时候,对有关args,kwargs,和*的使用感到很困惑.相信对此感到疑惑的人也有很多.我打算通过这个帖子来排解这个疑惑(希望能减少疑惑). 让我们通过以下5步来理解:  1. ...

  9. python中*args和**kwargs的理解,Python中的*args和**kwargs的理解与用法

    一.简述 1.*args和**kwargs 这两个是python中方法的可变参数. 2.*args表示任何多个无名参数,它是一个tuple: 3.**kwargs表示关键字参数,它是一个dict.并且 ...

最新文章

  1. python爬虫日志(9)爬取代理
  2. Oracle手工建库
  3. extern C 的作用
  4. 获取map第一个的key和value_Hadoop学习之路(3)Map-Shuffle-Reduce详解与源码
  5. Bash数组变量的赋值
  6. 醒醒吧!送给那些盲目自学的人
  7. Ajax调用springboot接口,Springboot解决ajax+自定义headers的跨域请求问题.pdf
  8. ORACLE数据库定时任务自动停止(broken)的原因分析及解决办法
  9. Node.js实现一个HTTP服务器
  10. 【炫斗之王win7主题下载】
  11. 最全的【英语词根词缀思维导图总结】
  12. 华为可信专业级认证是什么?
  13. java bean vo_关于JavaBean和vo的解释
  14. Activity实战之装备购买小案例
  15. 力扣刷题 DAY_74 回溯
  16. vue 实现抽奖大转盘
  17. 在MT终端模拟器中使用Termux命令
  18. 用JDevelop编程软件运行代码:韩信点兵,韩信有一队兵,他想知道有多少人,便让士兵排队报数:
  19. 白盒测试方法-静态结构分析法
  20. MYSQL高可用架构MMM实现

热门文章

  1. 详解MAC硬盘中各个文件夹
  2. 我的世界服务器显示unknown,我的世界找不到家怎么办-​我的世界unknown
  3. php aes java_AES php java 互转
  4. 高斯消元解模同余方程组
  5. 操作系统—内存管理的概念
  6. springboot+junit测试
  7. 数据库期末总结笔记( 零基础 )-第二章 关系数据库
  8. 抽象类及继承(本科生和研究生类)
  9. Brupsuit的安装与初步使用
  10. HDU 5942 2016CCPC杭州 J: Just a Math Problem(莫比乌斯函数)