在对Python进行编程时,有时会做**
一个转换。我了解它的作用,但是我正在操纵什么数据结构?一个dict
,另一个是什么?安array
?**
运营商有名字吗?
**
。功率和“关键字参数字典”。你在说什么 该文档包含以下单词:“如果存在形式“ ** identifier”,则将其初始化为一个新字典,该字典将接收任何多余的关键字参数,默认为一个新的空字典。” 他们中哪些似乎与您的问题有关?
在对Python进行编程时,有时会做**
一个转换。我了解它的作用,但是我正在操纵什么数据结构?一个dict
,另一个是什么?安array
?**
运营商有名字吗?
**
。功率和“关键字参数字典”。你在说什么 该文档包含以下单词:“如果存在形式“ ** identifier”,则将其初始化为一个新字典,该字典将接收任何多余的关键字参数,默认为一个新的空字典。” 他们中哪些似乎与您的问题有关?
Answers:
这不是一个运营商正因为如此,所以它并没有真正有一个名字,但它被定义为“语法规则”。因此应称为:
如果您有一组参数,*args
则将其称为“参数解压缩”,以同样的方式**kwargs
称为“关键字参数解压缩”。
如果您在的左侧使用它=
,例如a, *middle, end = my_tuple
,您将说“ tuple unpacking”。
总共有三种类型的(单个参数)参数:
def f(x) # x: positional argument
def f(x, y=0) # y: keyword argument
def f(x, *xs, y=0) # y: keyword-only argument
该*args
参数称为“可变位置参数”,并且**kwargs
为“可变关键字参数”。仅限关键字的参数不能在位置上给出,因为可变的位置参数将采用您传递的所有参数。
大部分内容都可以在PEP 0362和3102以及文档的“ 控制流”部分中找到。应当注意,功能签名对象PEP只是草稿,术语可能只是一个人的想法。但是无论如何,它们都是好词。:)
因此,*
and **
参数只是解压缩它们各自的数据结构:
args = (1, 2, 3) # usually a tuple, always an iterable[1]
f(*args) → f(1, 2, 3)
# and
kwargs = {"a": 1, "b": 2, "c": 3} # usually a dict, always a mapping*
f(**kwargs) -> f(a=1, b=2, c=3)
[1]:可迭代对象是实现__iter__()
方法的对象,而映射是实现keys()
和的对象__getitem__()
。构造函数tuple()
和可以理解支持该协议的任何对象dict()
,因此可以将它们用于解压缩参数。
def f(x, *xs, y=0): pass
不是有效的Python 2. {5,6,7}语法,也不def f(x, y=0, *xs):
是您期望的那样。AFAIK,达到(显然)预期效果的唯一方法是def f(x, *xs, **kw): y=kw.get('y', 0); del kw; ...
。Python 3按预期处理原始语法。
begin, *middle, end = (0, 1, 2, 3, 4, 5)
语法在Python 2.x中也不起作用。
我没有名字。在“解压缩参数列表”下的Python文档中,它仅称为“ **
-operator”。
我不确定“其他”数据结构的含义。当您f(**kwargs)
解压缩字典时kwargs
,将其作为键-值对的序列。我看不到涉及其他结构。
为了清楚起见,我将在上面的文档中复制该示例。
>>> def parrot(voltage, state='a stiff', action='voom'):
... print "-- This parrot wouldn't", action,
... print "if you put", voltage, "volts through it.",
... print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !
f(**kwargs)
……
如果您不确定如何称呼某个特定的运营商或未命名,可以随时使用Waka Waka Bang Splat作为参考,以帮助您确定该怎么称呼。在这种情况下,尽管有一些符号的替代名称,**
我还是称呼它。double-splat