Python 函数的参数传递*args和**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是剩下的参数。
def f(a,b,*args):
    print(a)
    print(args)
f([1,2,3,4,5])
# 输出为:
# 1
# (3, 4, 5)   # 变成元组了

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

再看下**kwargs传参的例子:

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

# 输出为:{'a': 1, 'b': 2}
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个参数,自动将后两位拼接成字典

再看*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}

版权声明:本文为weixin_43804047原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。