当前位置:   article > 正文

Python 函数的参数传递*args和**kwargs_python传参 **kwargs

python传参 **kwargs

Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递,不定参数传递(包裹传递)和解包裹传递。前三种都比较清楚,那么本文来讲一下包裹传递和解包裹传递。

  • args 是 arguments 的缩写,表示位置参数;
  • kwargs 是 keyword arguments 的缩写,表示关键字参数。

其实这只是编程人员约定的变量名字,你用其他的命名也没问题。这其实就是 Python 中可变参数的两种形式,并且 *args 必须放在 **kwargs 的前面,否则会有“SyntaxError: non-keyword arg after keyword arg”的语法错误。

知识点:

  1. 在函数调用时,*会以单个元素的形式解包一个元组,使其成为独立的参数。
  2. 在函数调用时,**会以键/值对的形式解包一个字典,使其成为独立的关键字参数。
先来看下*args的例子:
def f(a,*args):
    print(args)
f(1,2,3,4)

# 输出为:(2, 3, 4)
# 虽然传入1,2,3,4,但是解包为(1),(2,3,4),其中a是1,args是剩下的参数。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
'
运行
def f(a,b,*args):
    print(a)
    print(args)
f([1,2,3,4,5])
# 输出为:
# 1
# (3, 4, 5)   # 变成元组了
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在python中,当*和**符号出现在函数定义的参数中时,表示任意数目参数。*arg表示任意多个无名参数,类型为tuple; **kwargs表示关键字参数,为dict.

再看下**kwargs传参的例子:
def f(**kwargs):
    print(kwargs) 
f(a=1,b=2) # 实际传入参数是两个,但是给包裹在一起

# 输出为:{'a': 1, 'b': 2}
  • 1
  • 2
  • 3
  • 4
  • 5
'
运行
def f(name,age,**kwargs):
    print('name:',name,'age:',age,'info:',kwargs)
f('Jerry', 18, gender='M', job='Engineer')

# 输出为:name: Jerry age: 18 info: {'gender': 'M', 'job': 'Engineer'}
# 传入4个参数,自动将后两位拼接成字典
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
'
运行
再看*args和**kwargs混合使用的栗子:
def f(a,*args,**kwargs):
    print(a,args,kwargs)

f(1,2,3,x=4,y=5)
# 丢进去不确定参数的包裹:1,2,3,x=4,y=5
# 解包:1                    -a
# 解包:(2,3)			    -*args
# 解包:{'x': 4, 'y': 5}	    -**kwargs

# 输出为:1 (2, 3) {'x': 4, 'y': 5}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
'
运行
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/963804
推荐阅读
相关标签
  

闽ICP备14008679号