Python中,在形参前面加上"*"与"**",旨在让函数支持接受任意多的参数,它们可以出现在函数定义或是函数调用中。
1. 函数定义中:收集参数
在函数定义中把不能匹配的基于位置的参数收集到一个元组中,当这个函数被调用时,Python将所有基于位置的参数收集到一个新的元组中,并将这个元组赋值给变量 args。
def f(*args):
print(args)
f() # 打印 ()
f(1) # 打印 (1,)
f(1,2,3,4) # 打印 (1,2,3,4)
"**" 的特性与之类似,但它只对关键字参数有效。它将这些关键字收集到一个新的字典中,这个字典之后将能够用一般的字典工具处理。也就是说,"**" 形式允许你将关键字参数转换成字典,从而让你能使用诸如 keys 调用 ,字典迭代器遍历等。
def f(**args):
print(args)
f() # 打印 {}
f(a=1, b=2) # 打印 {'a':1, 'b':2}
def f(a, *args, **kargs):
print(a, args, kargs)
f(1, 2, 3, x=1, y=2)
# 打印: 1 (2,3) {'y':2, 'x':1}
2. 函数调用中:解包参数
我们也能在函数调用中使用"*", "**"语法。在这种上下文中,它与函数定义中的意思相反。也就是说,它会解包参数的集合,而不是创建参数的集合。
def func(a,b,c,d):
print(a,b,c,d)
# *
args = (1, 2)
args += (3, 4)
func(*args) # 打印 1 2 3 4
# **
args = {'a':1, 'b':2, 'c': 3}
args['d'] = 4
func(**args)
# 打印 1 2 3 4
# 下面每一个调用 ,都是打印 1 2 3 4
func(*(1,2),**{'d':4, 'c':3})
func(1, *(2,3),**{'d':4})
func(1, c=3, *(2,),**{'d':4})
func(1, *(2,3), d=4)
func(1, *(2,), c=3, **{'d':4})