python的拆包运算符*和**如何使用? [英] How are python's unpacking operators * and ** used?

查看:137
本文介绍了python的拆包运算符*和**如何使用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

解包/splat运算符***在适用于python版本(2.7、3.x <3.5和3.x> = 3.5)之间的适用性差异很大.

The unpacking/splat operators * and ** differ widely in their applicability across python versions (2.7, 3.x < 3.5 and 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和自述文件,但文档未对此进行详细说明.

Are there any more discrepancies between the various versions that I've missed? I'm looking through PEP and Readmes but the docs aren't detailed with this.

推荐答案

1992年左右(不确定Python版本).这来自 Python 1.0.1 的语法文件.

Around 1992 (not sure about Python version). This is from the Grammar file of 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形式的关键字参数调用.

Keyword Arguments: Functions and methods written in Python can now be called using keyword arguments of the form keyword = value.

Python 1.6+

现在有一种特殊的语法可以代替 apply() 功能. f(*args, **kwds)等效于apply(f, args, kwds).你 也可以使用变体f(a1, a2, *args, **kwds),您可以保留一个 或其他:f(*args)f(**kwds).

There's now special syntax that you can use instead of the apply() function. f(*args, **kwds) is equivalent to apply(f, args, kwds). You can also use variations f(a1, a2, *args, **kwds) and you can leave one or the other out: f(*args), f(**kwds).

Python< = 2.7 :

在Python 3.0中删除了元组参数解压缩.

Tuple parameter unpacking was removed in Python 3.0.

PEP 3113 :元组参数 拆包已删除..您不能再写def foo(a, (b, c)): .... 请使用def foo(a, b_c): b, c = b_c.

PEP 3113: Tuple parameter unpacking removed. You can no longer write def foo(a, (b, c)): .... Use def foo(a, b_c): b, c = b_c instead.

Python 3.0+

PEP 3132 :扩展的可迭代 开箱.现在,您可以编写诸如a, b, *rest = some_sequence之类的东西.甚至*rest, a = stuff.其余对象始终是 (可能为空)列表;右侧可能是任意迭代的.

PEP 3132: Extended Iterable Unpacking. You can now write things like a, b, *rest = some_sequence. And even *rest, a = stuff. The rest object is always a (possibly empty) list; the right-hand side may be any iterable.

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

PEP 3102: Keyword-only arguments. Named parameters occurring after *args in the parameter list must be specified using keyword syntax in the call. You can also use a bare * in the parameter list to indicate that you don’t accept a variable-length argument list, but you do have keyword-only arguments

Python 3.5+

PEP 448 ,另外 解开概括.

PEP 448, additional unpacking generalizations.


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


As far as I know there's no single page that lists all the syntax changes. Per version syntax changes are listed in the What's new in Python section or you could check the Grammar specification of each release to see the differences.

这篇关于python的拆包运算符*和**如何使用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆