一个单独的星号*
将序列或集合解包为定位参数。假设我们有
def add(a, b):
return a + b
values = (1, 2)
使用*
拆封运算符,我们可以编写s = add(*values)
,这将等同于编写s = add(1, 2)
。
双星号**
对于字典也执行相同的操作,为命名参数提供值:
values = { 'a': 1, 'b': 2 }
s = add(**values)
这两个运算符可以用于相同的函数调用。例如,给定:
def sum(a, b, c, d):
return a + b + c + d
values1 = (1, 2)
values2 = { 'c': 10, 'd': 15 }
如果执行 s = add(*values1, **values2)
,则等价于 s = sum(1, 2, c=10, d=15)
。
在Python文档的教程中,相关章节也有介绍。
类似地,*
和**
也可以用于参数。使用*
允许函数接受任意数量的位置参数,并将它们收集到单个参数中:
def add(*values):
s = 0
for v in values:
s = s + v
return s
现在当函数被调用时,例如s = add(1, 2, 3, 4, 5)
,values
将会是元组(1, 2, 3, 4, 5)
(这显然会产生结果15
)。
同样的,如果一个参数标记为**
,它将接收到一个dict
:
def get_a(**values):
return values['a']
s = get_a(a=1, b=2)
这允许在不必声明它们的情况下指定大量可选参数。
同样,两者可以结合使用:
def add(*values, **options):
s = 0
for i in values:
s = s + i
if "neg" in options:
if options["neg"]:
s = -s
return s
s = add(1, 2, 3, 4, 5)
s = add(1, 2, 3, 4, 5, neg=True)
s = add(1, 2, 3, 4, 5, neg=False)
*
和**
运算符。 - Ian Bicking[*a, b, *c]
或{**d1, **d2}
),您需要阅读 元组、列表和集合定义中的星号,字典定义中的双星号,该链接专门介绍了在函数调用和函数定义之外使用星号的情况。而关于早期的 PEP 3132,请参见 当您不知道序列长度时的 Python 多重解包赋值。 - ShadowRanger