python的splat运算符*和**在哪里有效?

时间:2017-07-27 09:05:27

标签: python function parameter-passing iterable-unpacking argument-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和Readmes,但文档并未详细说明。

1 个答案:

答案 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 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扩展的Iterable   拆包即可。您现在可以编写a, b, *rest = some_sequence之类的内容。甚至*rest, a = stuff。其余的对象总是如此   一个(可能是空的)清单;右边可以是任何可迭代的。

     

PEP 3102仅关键字参数。之后发生的命名参数   必须使用调用中的关键字语法指定参数列表中的*args。您还可以在参数列表中使用裸*来指示   您不接受可变长度参数列表,但确实如此   仅关键字参数

Python 3.5+

  

PEP 448,另外   解包一般化。

据我所知,没有单个页面列出所有语法更改。每个版本的语法更改都列在What's new in Python部分中,或者您可以检查每个版本的语法规范以查看差异。