oju*_*unk 3 python tuples python-3.x
我一直很喜欢Python3.5中添加的元组理解:
In [128]: *(x for x in range(5)),
Out[128]: (0, 1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)
但是,当我return直接尝试元组理解时,我得到一个错误:
In [133]: def testFunc():
...: return *(x for x in range(5)),
...:
File "<ipython-input-133-e6dd0ba638b7>", line 2
return *(x for x in range(5)),
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
这只是一个轻微的不便,因为我可以简单地将元组理解分配给变量并返回变量.但是,如果我尝试在字典理解中加入元组理解,我会得到同样的错误:
In [130]: {idx: *(x for x in range(5)), for idx in range(5)}
File "<ipython-input-130-3e9a3eee879c>", line 1
{idx: *(x for x in range(5)), for idx in range(5)}
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我觉得这有点问题,因为在某些情况下,压缩对性能很重要.
在这些情况下使用字典和列表推导没有问题.当其他人做的时候,有多少其他情况是元组理解无法发挥作用?或许我使用它错了?
它让我想知道如果它的使用是如此有限或者我做错了什么的重点是什么?如果我没有做错什么,那么创建一个足够多的元组的最快/最pythonic方式是什么,以与列表和字典理解相同的方式使用?
TLDR:如果你想要一个元组,将生成器表达式传递给tuple:
{idx: tuple(x for x in range(5)) for idx in range(5)}
Run Code Online (Sandbox Code Playgroud)
Python中没有"元组理解".这个:
x for x in range(5)
Run Code Online (Sandbox Code Playgroud)
是一个生成器表达式.在它周围添加括号仅用于将其与其他元素分开.这与in相同(a + b) * c,也不涉及元组.
该*标志是迭代器打包/解包.生成器表达式恰好是可迭代的,因此可以解压缩.但是,一定有什么解压迭代成.例如,还可以将列表解压缩到赋值的元素中:
*[1, 2] # illegal - nothing to unpack into
a, b, c, d = *[1, 2], 3, 4 # legal - unpack into assignment tuple
Run Code Online (Sandbox Code Playgroud)
现在,*<iterable>,将*解包与,元组文字结合起来.但是在所有情况下都不能使用 - 分离元素可能优先于创建元组.例如,最近,在[*(1, 2), 3]分离时,而[(*(1, 2), 3)]它会创建一个元组.
在字典中,,它是模糊的,因为它用于分隔元素.比较{1: 1, 2: 2}并注意这 {1: 2,3}是非法的.对于return声明,将来可能会有可能.
如果你想要一个元组,你应该()在任何可能存在歧义时使用 - 即使Python可以处理它,否则很难为人类解析.
当你的源是一个大型语句,如生成器表达式时,我建议显式转换为元组.为了便于阅读,请比较以下两个有效版本的代码:
{idx: tuple(x for x in range(5)) for idx in range(5)}
{idx: (*(x for x in range(5)),) for idx in range(5)}
Run Code Online (Sandbox Code Playgroud)
请注意,list和dict理解也类似 - 它们实际上就像将生成器表达式传递给list,set或者dict.他们大多用来避免仰视list,set或dict在全局命名空间.
我觉得这有点问题,因为在某些情况下,压缩对性能很重要.
在封面下,生成器表达式和list/dict/set comprehensions都创建了一个短暂的函数.除非您对它们进行了分析和测试,否则您不应该依赖理解来进行性能优化.默认情况下,使用对您的用例最具可读性的内容.
dis.dis("""[a for a in (1, 2, 3)]""")
1 0 LOAD_CONST 0 (<code object <listcomp> at 0x10f730ed0, file "<dis>", line 1>)
2 LOAD_CONST 1 ('<listcomp>')
4 MAKE_FUNCTION 0
6 LOAD_CONST 5 ((1, 2, 3))
8 GET_ITER
10 CALL_FUNCTION 1
12 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
261 次 |
| 最近记录: |