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的解包操作符*和**是如何使用的?的主要内容,如果未能解决你的问题,请参考以下文章