我应该避免重复打包多个迭代器拆包吗?例如:(*(1,2),*(3,4))得到(1,2,3,4)

2024-10-03 11:17:07 发布

您现在位置:Python中文网/ 问答频道 /正文

获取(*(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))))

但这些都导致了同样的语法错误。但是我在WindowsIDLE 3.6.3shell和UbuntuPython3.6.5($ python3)中尝试了这一点,并且都成功了

因此,我在npp python插件控制台中尝试了(*(1,2), *(3,4)),它与IDLE和ubuntu中的错误形成了对比

是因为npp插件控制台不支持python,还是语法不标准

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


Tags: 插件map标准bytes定义语法rangejoin
2条回答

在Python3.7中,它是有效的

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

在Python3.4中,它没有

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

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

Python3.5(我想)通过解包引入了这些构造元组、dict等的新方法

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

下面是另一个关于dict的有趣例子。合并两条格言

d = {**d1, **d2}

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

  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

祝你好运

相关问题 更多 >