* 用于传递位置参数(positional argument)
** 用于传递关键字参数(keyword argument)
首先,先通过一个简单的例子来介绍 * 的用法:
def add_function(a, b): return a + b a = 1 b = 2 c = [1, 2] print(add_function(a, b)) print(add_function(*c))
输出是:
3 3
从输出可以看到,使用 * 可以将列表 c 中的值分别传递给函数的参数们。注意,列表中元素的个数需要与函数参数的个数相等。
*args (arguments) 的用法与 * 稍微不太一样,*args在定义函数时使用。
def myFun(*args): for arg in args: print(arg) print(args) myFun(1,2,3)
输出是:
1 2 3 (1, 2, 3)
由例子可知,*args用于接收可变数量的无名参数,并且存在元组 (tuple) 里,元组中的元素是无法修改的。
最后来讲解一下 **kwargs (keyword arguments) 的用法。
def myFun2(**kwargs): for key, value in kwargs.items(): print ("%s == %d" %(key, value)) print(kwargs) myFun2(One=1, Two=2, Three=3)
输出是:
One == 1 Two == 2 Three == 3 {'One': 1, 'Two': 2, 'Three': 3}
从这个例子可以看出,**kwargs用于接收可变数量的关键字参数,并且存在字典里 (dict)。
注意,需要按照 arg, *args, **kwargs 这个顺序定义一个函数。
def myFun3(arg,*args,**kwargs): print("arg is :", arg) print("*args are :", args) print("**kwargs are :", kwargs) myFun3(')
输出是
arg is : a *args are : ('b', 'c') **kwargs are : {'}
References
GeeksforGeeks. (n.d.). *args and **kwargs in Python - GeeksforGeeks. [online] Available at: https://www.geeksforgeeks.org/args-kwargs-python/.
Lakhanpal, R. (2016). Python *,**,*args and **kwargs. [online] Medium. Available at: https://medium.com/@rahulkp220/python-args-and-kwargs-5fb545b7a538.