星号*在Python中是什么意思?
*在Python中是否像在C中一样有特殊的含义?我在Python食谱中看到了这样一个函数:星号*在Python中是什么意思?,python,Python,*在Python中是否像在C中一样有特殊的含义?我在Python食谱中看到了这样一个函数: def get(self, *a, **kw) 请您给我解释一下,或者指出我在哪里可以找到答案(谷歌将*解释为通配符,因此我无法找到满意的答案)。请参见语言参考中的 如果表单*标识符为 现在,它被初始化为一个元组 接收任何多余的位置信息 参数,默认为空 元组。如果表单**标识符为 现在,它被初始化为一个新的 有多余的吗 关键字参数,默认为新参数 空字典 另外,请参见 假设您知道位置参数和关键字参数是什么
def get(self, *a, **kw)
请您给我解释一下,或者指出我在哪里可以找到答案(谷歌将*解释为通配符,因此我无法找到满意的答案)。请参见语言参考中的
如果表单*标识符为
现在,它被初始化为一个元组
接收任何多余的位置信息
参数,默认为空
元组。如果表单**标识符为
现在,它被初始化为一个新的
有多余的吗
关键字参数,默认为新参数
空字典
另外,请参见
假设您知道位置参数和关键字参数是什么,下面是一些示例:
例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'}
a = testa
b = testb
c = testc
('excess', 'another_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
{'k': 'another_excess', 'd': 'excess'}
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'}
a=testa
b=testb
c=testc
args=('excess',)
及
印刷品:
a=testa
b=testb
c=testc
args={'excessarg': 'string'}
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]
你可以像这样把名单传给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)
当然,闭包提供了做同样事情的另一种方法,而无需将x、y和z通过某个函数()传递到我的函数()中。以上所有答案都非常清晰完整,但是为了记录在案,我想确认python中*和**的含义与C中类似的运算符的含义绝对不相似
它们被称为参数解包运算符和关键字参数解包运算符。不要吹毛求疵,但如果使用单星,参数将存储为元组,而不是列表。虽然这是一个非常精确的定义,但这是一个非常糟糕的解释;而且不太可能真正帮助一个苦苦挣扎的程序员。文档的链接已断开。当没有参数名称时,星号是什么意思?例如,在类的某些函数中,它将常规参数与仅关键字参数分开。从“*”的文档索引页:我发现这个解释非常有启发性。这位评论者明确表示“假设一个人知道位置参数和关键字参数是什么。”所以他做得非常好。所有标准化机构都很好地解释了这一点,7年后才提出,但如果您从fn声明中删除**
,只使用def foo(argd):
并运行foo(d)
,您将得到相同的结果。那么为什么要使用**
呢?@David是的,你说得对。该示例只是演示如何“解包”dict,然后在函数中“重新打包”。例如,foo(a=“b”,c=“d”)
也将提供与foo(**d)
相同的输出。我看到了第一个答案,我想,“不,这不是我想要的”,然后我看到了您的答案:)为了清楚起见,这个示例使用*
来解包序列(例如列表)当作为参数传递给一个函数时,该函数使用*args
作为任意数量的位置参数。需要澄清的是,我最初的想法是通过引用传递*请参见一个简单的星号,这仍然是重复的吗?引用的问题特别是关于函数的参数,而这个问题(至少从其标题来看)也将涉及类似[*my_dict]