设为首页 收藏本站
查看: 1212|回复: 0

[经验分享] 关于python中*args,**kwargs的可变参数

[复制链接]

尚未签到

发表于 2018-8-13 11:12:41 | 显示全部楼层 |阅读模式
  在查看python的函数时,经常会看到*args,**kwargs这样的参数信息,对于可变参数进行了查阅学习,对以下博文进行转载记录。
【转载】Python中函数的参数定义和可变参数
  刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和**让人有点费解。其实只要把函数参数定义搞清楚了,就不难理解了。
  先说说函数定义,我们都知道,下面的代码定义了一个函数funcA
  def funcA():
  pass
  显然,函数funcA没有参数(同时啥也不干:D)。
  下面这个函数funcB就有两个参数了,
  def funcB(a, b):
  print a
  print b
  调用的时候,我们需要使用函数名,加上圆括号扩起来的参数列表,比如 funcB(100, 99),执行结果是:
  100
  99
  很明显,参数的顺序和个数要和函数定义中一致,如果执行funcB(100),Python会报错的:
  TypeError: funcB() takes exactly 2 arguments (1 given)
  我们可以在函数定义中使用参数默认值,比如
  def funcC(a, b=0):
  print a
  print b
  在函数funcC的定义中,参数b有默认值,是一个可选参数,如果我们调用funcC(100),b会自动赋值为0。
  OK,目前为止,我们要定义一个函数的时候,必须要预先定义这个函数需要多少个参数(或者说可以接受多少个参数)。一般情况下这是没问题的,但是也有在定义函数的时候,不能知道参数个数的情况(想一想C语言里的printf函数),在Python里,带*的参数就是用来接受可变数量参数的。看一个例子
  def funcD(a, b, *c):
  print a
  print b
  print "length of c is: %d " % len(c)
  print c
  调用funcD(1, 2, 3, 4, 5, 6)结果是
  1
  2
  length of c is: 4
  (3, 4, 5, 6)
  我们看到,前面两个参数被a、b接受了,剩下的4个参数,全部被c接受了,c在这里是一个tuple。我们在调用funcD的时候,至少要传递2个参数,2个以上的参数,都放到c里了,如果只有两个参数,那么c就是一个empty tuple。
  好了,一颗星我们弄清楚了,下面轮到两颗星。
  上面的例子里,调用函数的时候,传递的参数都是根据位置来跟函数定义里的参数表匹配的,比如funcB(100, 99)和funcB(99, 100)的执行结果是不一样的。在Python里,还支持一种用关键字参数(keyword argument)调用函数的办法,也就是在调用函数的时候,明确指定参数值付给那个形参。比如还是上面的funcB(a, b),我们通过这两种方式调用
  funcB(a=100, b=99)
  和
  funcB(b=99, a=100)
  结果跟funcB(100, 99)都是一样的,因为我们在使用关键字参数调用的时候,指定了把100赋值给a,99赋值给b。也就是说,关键字参数可以让我们在调用函数的时候打乱参数传递的顺序!
  另外,在函数调用中,可以混合使用基于位置匹配的参数和关键字参数,前题是先给出固定位置的参数,比如
  def funcE(a, b, c):
  print a
  print b
  print c
  调用funcE(100, 99, 98)和调用funcE(100, c=98, b=99)的结果是一样的。
  好了,经过以上铺垫,两颗星总算可以出场了:
  如果一个函数定义中的最后一个形参有 ** (双星号)前缀,所有正常形参之外的其他的关键字参数都将被放置在一个字典中传递给函数,比如:
  def funcF(a, **b):
  print a
  for x in b:
  print x + ": " + str(b[x])
  调用funcF(100, c='你好', b=200),执行结果
  100
  c: 你好
  b: 200
  大家可以看到,b是一个dict对象实例,它接受了关键字参数b和c。
  常规参数,*参数及**参数可以同时使用,具体怎么用?看看Python Reference Manual吧,关于Function definitions的那些章节。其实,笨想也能猜出来啊,o(∩_∩)o...
  博文链接:
  https://zm10.sm-tc.cn/?src=l4uLj8XQ0IiIiNGckZ2TkJiM0ZyQktCLjoyKkpKajdCejYuWnJOajNDOxsvLy87J0ZeLkpM%3D&uid=c5df1a4cfde955102dba8d302ae21b44&hid=2a732e11224cb0d02af164fc7dc0a959&pos=1&cid=9&time=1506390512685&from=click&restype=1&pagetype=0020004000000408&bu=news_natural&query=python+%E5%8F%AF%E5%8F%98%E5%8F%82%E6%95%B0&mode=&v=1&uc_param_str=dnntnwvepffrgibijbprsvdsdichei

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-551111-1-1.html 上篇帖子: python 之编码规范-000001 下篇帖子: python之学习路线图
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表