对于*args和**kwargs,其实名称是无所谓的,叫阿猫阿狗都可以,关键是运算符*和**。
在python中向函数传递参数的方式有两种:位置参数和关键字参数
*args 表示任何多个无名参数, 他本质上是一个 tuple
** kwargs 表示关键字参数, 它本质上是一个 dict
当args、*args、**kwargs同时出现在函数的形参列表中的时候,**kwargs要放在最后、其次是*args、最后是args
那么*和**究竟是什么作用呢?
一言以蔽之:就是拆包和装包
def test_var_args(args, *argv):
print("first normal args:",args)
for arg in argv:
print("another arg through *argv:",arg)
test_var_args('yasoob','python','eggs','test')
以这上面的代码为例,调用函数的时候,形参args接受了‘yasoob’;其余三个字符串是独立的,并没有以任何数据结构组织起来,所以在调用时运算符*就将其“装包了”。同理,如果函数的第二个参数是a,a=['python','eggs','test'], 此时argv是什么呢。答案是(['python','eggs','test'],)。也就是说实参会被装包。
但如果实参中是*args,形参中是argv1,argv2,argv3,则传入的a中的‘python’‘eggs’‘test’会被分别传给argv1、argv2、argv3.
**kwargs只不过是键值对的而已,所以在传入的时候也要以键值对的形式传入形参,如:
print_func(a=1, b=2, c='呵呵哒', d=[])
kwargs = {"arg3": 3,"arg2":"two","arg1":5}
test_args_kwargs(**kwargs)
图二是实参情况