18

unpacking/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 和自述文件,但文档没有详细说明。

4

1 回答 1

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 1.4+

关键字参数:现在可以使用形式的关键字参数调用用 Python 编写的函数和方法keyword = value

Python 1.6+

现在可以使用特殊语法代替apply() 函数。f(*args, **kwds)相当于apply(f, args, kwds)。您也可以使用变体f(a1, a2, *args, **kwds),并且可以省略其中一个:f(*args), f(**kwds).

Python <= 2.7

在 Python 3.0 中删除了元组参数解包。

PEP 3113元组参数解包已删除。你不能再写了def foo(a, (b, c)): ...。改为使用def foo(a, b_c): b, c = b_c

Python 3.0+

PEP 3132扩展的可迭代拆包。您现在可以编写类似a, b, *rest = some_sequence. 甚至*rest, a = stuff。rest 对象总是一个(可能是空的)列表;右手边可以是任何可迭代的。

PEP 3102仅关键字参数。参数列表中出现的命名参数 *args必须在调用中使用关键字语法指定。你也可以*在参数列表中使用一个bare来表示你不接受可变长度的参数列表,但是你确实有关键字参数

Python 3.5+

PEP 448,额外的解包概括。


据我所知,没有一个页面可以列出所有语法更改。每个版本的语法更改列在Python 中的新增功能部分中,或者您可以查看每个版本的语法规范以查看差异。

于 2017-07-27T09:14:23.160 回答