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

问题描述 投票:1回答:2

语法(*(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或语法不标准?

我试图找到信息,但我甚至无法获得关键字。没有人在谈论解压缩的语法重新打包。

python python-3.x syntax
2个回答
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(我认为)通过解包引入了构造元组,dicts等的这些新方法。

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

这是dicts的另一个有趣的例子。合并两个词,

d = {**d1, **d2}

这里是PEP-448 - 介绍了这种语法


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

祝好运!

© www.soinside.com 2019 - 2024. All rights reserved.