星号*在Python中是什么意思?

*在Python中有特殊的含义吗?我在Python Cookbook中看到了这样一个函数:

def get(self, *a, **kw)

你能给我解释一下吗?或者告诉我在哪里可以找到答案(谷歌将*解释为通配符,因此我无法找到满意的答案)。

245190 次浏览

参见语言参考中的函数定义

如果*identifier形式为 现在,它被初始化为一个元组 接收任何多余的位置 参数,默认为空 元组。如果**identifier形式为 现在,它被初始化为一个new 接收任何多余的字典 关键字参数,默认为new 空字典。< / p >

另外,参见函数调用

假设你知道位置参数和关键字参数是什么,下面是一些例子:

示例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。由于dk不存在,它们被放入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',)

单个星号意味着变量' A '将是提供给函数的额外参数的元组。双星表示变量'kw'将是一个随关键字提供的额外参数的可变大小字典。

尽管实际的行为是指定的,但有时仍然非常不直观。编写一些示例函数并使用不同的参数样式调用它们可以帮助您理解什么是允许的以及结果是什么。

def f0(a)
def f1(*a)
def f2(**a)
def f3(*a, **b)
etc...

我只有一件事要补充,这是从其他答案中不清楚的(为了完整性)。

在调用函数时也可以使用星号。例如,假设你有这样的代码:

>>> 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'}

我发现在编写以另一个回调函数作为参数的函数时,*很有用:

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()将x、y和z传递给my_callback_function()。

上面所有的答案都是非常清晰和完整的,但只是为了记录,我想确认python中*和**的含义与C中相似的操作符的含义绝对没有相似之处。

它们被称为参数解包操作符和关键字参数解包操作符。