解包/ splat运算符*
和**
在python版本中的适用性差异很大(2.7,3.x< 3.5和3.x> = 3.5)。
例如:
| 2.7 | 3.1-3.4 | 3.5
----------------------------------------------------------------------
function(*args) ✓ ✓ ✓
x, *y, z = [1, 2, 3, 4, 5] x ✓ ✓
{**x, **y} x x ✓
我错过的各个版本之间是否还有其他差异?我正在浏览PEP和Readmes,但文档并未详细说明。
答案 0 :(得分:22)
1992年左右(不确定Python版本)。这来自Python 1.0.1的语法文件。
# 06-Apr-92:
# Use only '*' for varargs list
# 31-Mar-92:
# Tighten syntax for try statements
# 27-Feb-92:
# Allow NEWLINE* after eval input
# 16-Jan-92:
# Added '*' as alternative for '+' in varargs syntax
# (Not sure which alternative is better yet.)
# 11-Jan-92:
# Variable length argument list syntax added: def f(a, b, +rest): ...
关键字参数:现在可以使用Python编写的函数和方法 使用
keyword = value
形式的关键字参数调用。
现在可以使用特殊语法代替
apply()
功能。f(*args, **kwds)
相当于apply(f, args, kwds)
。您 也可以使用变体f(a1, a2, *args, **kwds)
,你可以留下一个 或另一个:f(*args)
,f(**kwds)
。
在Python 3.0中删除了元组参数解包。
PEP 3113:元组参数 解包已删除。您无法再写
def foo(a, (b, c)): ...
。 请改用def foo(a, b_c): b, c = b_c
。
PEP 3132:扩展的Iterable 拆包即可。您现在可以编写
a, b, *rest = some_sequence
之类的内容。甚至*rest, a = stuff
。其余的对象总是如此 一个(可能是空的)清单;右边可以是任何可迭代的。PEP 3102:仅关键字参数。之后发生的命名参数 必须使用调用中的关键字语法指定参数列表中的
*args
。您还可以在参数列表中使用裸*
来指示 您不接受可变长度参数列表,但确实如此 仅关键字参数
PEP 448,另外 解包一般化。
据我所知,没有单个页面列出所有语法更改。每个版本的语法更改都列在What's new in Python部分中,或者您可以检查每个版本的语法规范以查看差异。