本问题已经有最佳答案,请猛点这里访问。
*在python中是否和在c中一样有特殊的含义?我在python食谱中看到了这样的函数:
def get(self, *a, **kw)
请你向我解释一下,或者指出我在哪里可以找到答案(谷歌将*解释为通配符,因此我找不到满意的答案)。
非常感谢你。
为了帮助谷歌搜索者,也许你应该在问题标题中加上"星号"(如果它允许你编辑标题)。
重复的问题有更好的答案。
另请参阅stackoverflow.com/questions/14301967/…以获取空星号
请参见语言参考中的函数定义。
If the form *identifier is
present, it is initialized to a tuple
receiving any excess positional
parameters, defaulting to the empty
tuple. If the form **identifier is
present, it is initialized to a new
dictionary receiving any excess
keyword arguments, defaulting to a new
empty dictionary.
另请参见函数调用。
假设您知道什么是位置参数和关键字参数,下面是一些示例:
例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不存在,它们被放入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',)
虽然这是一个非常精确的定义,但这是一个非常糟糕的解释;而且不太可能真正帮助一个陷入困境的程序员。
到文档的链接已断开。
当没有参数名时,星号是什么意思?例如,在类pprint的一些函数中。
它将常规参数与仅关键字参数分开。从"*"的文档索引页:docs.python.org/dev/reference/compound-stmts.html index-22
是啊。解释什么是元组和字典。
什么是多余的关键字参数?我能举个例子吗?
我觉得这个解释很有启发性。解说员清楚地说:"假设一个人知道什么是位置和关键字论点。"所以他做得非常出色。这是所有标准都很好的解释
我只有一件事要补充,那是其他答案中不清楚的(为了完整性)。
调用函数时也可以使用星号。例如,假设您有这样的代码:
>>> def foo(*args):
... print(args)
...
>>> l = [1,2,3,4,5]
你可以把我的名单这样传给foo…
>>> foo(*l)
(1, 2, 3, 4, 5)
你也可以为字典做同样的事情…
>>> def foo(**argd):
... print(argd)
...
>>> d = {'a' : 'b', 'c' : 'd'}
>>> foo(**d)
{'a': 'b', 'c': 'd'}
很抱歉7年后提出这个问题,但是如果你从FN声明中删除了**,只使用def foo(argd):,你运行foo(d),你会得到同样的结果。那么为什么使用**?
@大卫是的,你说得对。该示例只是演示如何"解包"dict,然后在函数内部"重新打包"。例如,foo(a="b", c="d")也将提供与foo(**d)相同的输出。
我看到了第一个答案,我想,"不,这不是我想要的",然后我看到了你的答案:)
以上所有答案都是非常清楚和完整的,但就记录而言,我想确认python中*和**的含义与c中类似的looking操作符的含义完全不相似。
它们被称为参数解包和关键字参数解包运算符。
必要的澄清,我最初的想法是通过参考*
单星表示变量"a"将是提供给函数的额外参数的元组。双星表示变量"kw"将是一个包含关键字的额外参数的可变大小字典。
虽然实际的行为是规范化的,但有时仍然是非常不直观的。编写一些示例函数并使用各种参数样式调用它们可能有助于您了解允许的内容和结果。
def f0(a)
def f1(*a)
def f2(**a)
def f3(*a, **b)
etc...
不必吹毛求疵,但是如果您使用一个星,那么参数将存储为一个元组,而不是一个列表。
我发现*在编写将另一个回调函数作为参数的函数时很有用:
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)
当然,闭包提供了另一种方法来执行相同的操作,而不需要通过某个_函数()将x、y和z传递给我的_回调_函数()。