在Python中,*在C中有特殊含义吗?我在Python Cookbook中看到了这样的函数:
def get(self, *a, **kw)
请您向我解释一下,或指出我能在哪里找到答案(Google将*解释为外卡字符,因此无法找到满意的答案)。
非常感谢。
答案 0 :(得分:237)
请参阅语言参考中的Function Definitions。
如果表单
*identifier
是 目前,它被初始化为元组 收到任何多余的位置 参数,默认为空 元组。如果表单**identifier
是 目前,它被初始化为一个新的 收到任何多余的字典 关键字参数,默认为新的 空词典。
另请参阅Function Calls。
假设有人知道位置和关键字参数是什么,这里有一些例子:
示例1:
# Excess keyword argument (python 2) example:
def foo(a, b, c, **args):
print "a = %s" % (a,)
print "b = %s" % (b,)
print "c = %s" % (c,)
print args
foo(a="testa", d="excess", c="testc", b="testb", k="another_excess")
正如您在上面的示例中所看到的,我们在a, b, c
函数的签名中只有参数foo
。由于d
和k
不存在,因此将它们放入args字典中。该计划的输出是:
a = testa
b = testb
c = testc
{'k': 'another_excess', 'd': 'excess'}
示例2:
# Excess positional argument (python 2) example:
def foo(a, b, c, *args):
print "a = %s" % (a,)
print "b = %s" % (b,)
print "c = %s" % (c,)
print args
foo("testa", "testb", "testc", "excess", "another_excess")
这里,由于我们正在测试位置参数,多余的参数必须在最后,*args
将它们打包成一个元组,因此该程序的输出为:
a = testa
b = testb
c = testc
('excess', 'another_excess')
您还可以将字典或元组解压缩到函数的参数中:
def foo(a,b,c,**args):
print "a=%s" % (a,)
print "b=%s" % (b,)
print "c=%s" % (c,)
print "args=%s" % (args,)
argdict = dict(a="testa", b="testb", c="testc", excessarg="string")
foo(**argdict)
打印:
a=testa
b=testb
c=testc
args={'excessarg': 'string'}
和
def foo(a,b,c,*args):
print "a=%s" % (a,)
print "b=%s" % (b,)
print "c=%s" % (c,)
print "args=%s" % (args,)
argtuple = ("testa","testb","testc","excess")
foo(*argtuple)
打印:
a=testa
b=testb
c=testc
args=('excess',)
答案 1 :(得分:163)
我只有一件事要补充,其他答案并不清楚(为了完整性)。
调用该功能时,您也可以使用星标。例如,假设你有这样的代码:
>>> def foo(*args):
... print(args)
...
>>> l = [1,2,3,4,5]
您可以将列表l传递给foo,就像这样......
>>> foo(*l)
(1, 2, 3, 4, 5)
你可以为字典做同样的事情......
>>> def foo(**argd):
... print(argd)
...
>>> d = {'a' : 'b', 'c' : 'd'}
>>> foo(**d)
{'a': 'b', 'c': 'd'}
答案 2 :(得分:67)
所有上述答案都非常清晰和完整,但仅仅为了记录,我想确认python中*和**的含义与C中类似外观操作符的含义完全没有相似之处。
它们被称为argument-unpacking和keyword-argument-unpacking操作符。
答案 3 :(得分:35)
单个星形意味着变量“a”将是提供给函数的额外参数的元组。双星表示变量'kw'将是随关键字提供的额外参数的可变大小字典。
虽然指出了实际行为,但有时仍然非常不直观。编写一些示例函数并使用各种参数样式调用它们可以帮助您了解允许的内容和结果。
def f0(a)
def f1(*a)
def f2(**a)
def f3(*a, **b)
etc...
答案 4 :(得分:27)
在编写一个将另一个回调函数作为参数的函数时,我发现*非常有用:
def some_function(parm1, parm2, callback, *callback_args):
a = 1
b = 2
...
callback(a, b, *callback_args)
...
这样,调用者可以传入任意额外的参数,这些参数将被传递给他们的回调函数。好消息是回调函数可以使用正常的函数参数。也就是说,它根本不需要使用*语法。这是一个例子:
def my_callback_function(a, b, x, y, z):
...
x = 5
y = 6
z = 7
some_function('parm1', 'parm2', my_callback_function, x, y, z)
当然,闭包提供了另一种做同样事情的方法,而不需要你通过some_function()和my_callback_function()传递x,y和z。