我应该避免重新包装未包装的多个可迭代项吗?例如(*(1,2),*(3,4))得到(1,2,3,4)

时间:2019-04-17 15:50:48

标签: python python-3.x syntax

获取(*(1,2),*(3,4))的语法(1,2,3,4)是否受标准支持,因此是可移植的,还是只是实现定义的语法,因此应该避免吗?

在使用notepad ++插件的python控制台时,我发现了两者

bytes((*range(ord('a'),ord('z')+1),*range(ord('A'),ord('Z')+1))).decode()

"".join(map(chr,(*range(ord('a'),ord('z')+1),*range(ord('A'),ord('Z')+1))))

但是这些引起了相同的SyntaxError。但是我在Windows IDLE 3.6.3 Shell和ubuntu python 3.6.5($ python3)中进行了尝试,并且都可以使用。

所以我在npp python插件控制台中尝试了(*(1,2), *(3,4)),与IDLE和ubuntu相比,它引起了相同的错误。

是因为npp插件控制台不很好地支持python还是语法不标准?

我试图查找信息,但我什至无法获取关键字。没有人在谈论解压缩语法。

2 个答案:

答案 0 :(得分:1)

在Python 3.7中,它有效

x = (*(1,2), *(3,4))

在python 3.4中不是

x = (*(1,2), *(3,4))

  File "main.py", line 1
    x = (*(1,2), *(3,4))
         ^
SyntaxError: invalid syntax

Python 3.5(我认为)介绍了通过解包构造元组,字典等的这些新方法。

您可能在这两个环境中使用了两个不同版本的python-3.x。

这是dict的另一个有趣示例。合并两个字典,

d = {**d1, **d2}

这是PEP-448-引入了这种语法

答案 1 :(得分:0)

  1. 您共享的代码在Python 3.5+中受支持,但在任何较早的版本中均不支持。

  2. 在这里我不建议您使用*运算符,它通常不用于这种用法-更多用于函数调用中的可变参数。如果有的话,请使用一两个迭代器,使其更清晰。

result = \
    "".join(chr(c) for c in range(ord('a'), ord('z')+1)) + \
    "".join(chr(c) for c in range(ord('A'), ord('Z')+1))

简单性和可维护性在实际代码中非常重要。

  1. 更好的是,您可以使用:
import string
result = string.ascii_lowercase + string.ascii_uppercase

祝你好运!