python的解包操作符*和**是如何使用的?

Posted

技术标签:

【中文标题】python的解包操作符*和**是如何使用的?【英文标题】:How are python's unpacking operators * and ** used? 【发布时间】:2018-01-02 21:46:39 【问题描述】:

unpacking/splat 运算符 *** 在 Python 版本(2.7、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 和自述文件,但文档没有详细说明。

【问题讨论】:

【参考方案1】:

大约 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。其余对象总是 一个(可能是空的)列表;右侧可以是任何可迭代的。

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

Python 3.5+

PEP 448,附加 解包概括。


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

【讨论】:

很好的研究; 'varargs' 语法 ( *name ) 是什么时候引入的?这早于 Python 3(或可能向后移植) @Chris_Rands 你指的是作业中使用的那个吗? 我的意思是max(*(1,2,3)) @Chris_Rands 这是在 Python 1.6 中添加的。已更新答案。 @kmario23 是的,max()min() 可以使用可迭代和单独的参数,但这只是 Chris 的一个示例。

以上是关于python的解包操作符*和**是如何使用的?的主要内容,如果未能解决你的问题,请参考以下文章

Python 序列与映射的解包操作

如何在 C# 中复制 Perl 的解包功能?

python 3中的解包语法

Python中的解包用法

python中的解包

apk文件的解包和打包操作