星号*在Python中意味着什么?
在Python中,它具有特殊的意义吗? 我在Python Cookbook中看到了这样一个函数:
def get(self, *a, **kw)
请你向我解释一下,或者指出我在哪里可以find答案(谷歌将*解释为通配符,因此我找不到满意的答案)。
非常感谢你。
请参阅语言参考中的函数定义 。
如果表单
*identifier
存在,则将其初始化为接收任何多余位置参数的元组,默认为空元组。 如果存在表单**identifier
,则将其初始化为接收任何多余关键字参数的新字典,默认为新的空字典。
另请参阅函数调用 。
假设一个人知道什么是位置和关键字参数,下面是一些例子:
例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")
正如你在上面的例子中看到的,我们在foo
函数的签名中只有参数a, b, c
。 由于d
和k
不存在,所以将它们放入参数字典中。 该scheme的输出是:
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")
在这里,由于我们正在testing位置参数,所以多余的必须是最后的,并且*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',)
我只有一件事要补充说,从其他答案(为了完整起见)不清楚。
调用函数时也可以使用星号。 例如,假设你有这样的代码:
>>> 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'}
以上所有的答案都是非常清晰和完整的,但为了logging,我想确认python中*和**的含义与C中类似外观的操作符的含义是完全不相似的。
它们被称为参数解包和关键字参数解包操作符。
编写一个将另一个callback函数作为参数的函数时,我发现*非常有用:
def some_function(parm1, parm2, callback, *callback_args): a = 1 b = 2 ... callback(a, b, *callback_args) ...
这样,调用者可以传入任何额外的参数,这些参数将被传递给它们的callback函数。 好的是,callback函数可以使用正常的函数参数。 也就是说,它根本不需要使用*语法。 这是一个例子:
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。
单星形意味着variables“a”将是提供给函数的额外参数的元组。 双星意味着variables“kw”将是一个由关键字提供的额外参数的可变长度字典。
虽然实际的行为已经被指出,但是有时它可能是非直观的。 编写一些示例函数并用各种参数样式调用它们可能会帮助您理解什么是允许的以及结果是什么。
def f0(a) def f1(*a) def f2(**a) def f3(*a, **b) etc...