Agu*_*guy 1 python syntax python-3.x
我知道for在嵌套列表中理解的正确方法如下(Python 3):
lista = [[[1,2],[3],[4,5,6]],[[7],[8,9]]]
flatlista = [i for k in lista for j in k for i in j]
# results with [1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
但我的自然语言本能强烈反对.我会(错误地)期望代码是:
flatlista = [i for i in j for j in k for k in lista]
Run Code Online (Sandbox Code Playgroud)
错误的版本听起来几乎像英语,从左到右读取一个流.正确的版本需要一些嵌套的阅读技巧,左右跳过以涵盖其含义.
为什么这样的语法呢?为什么用这种方式构建语言?
因为这就是PEP 202 - List Comprehensions所设定的.然而,PEP并不能激发为什么,因为它是作为事后的想法创建的; 在PEP创建之前的几年,甚至已经创建了PEP 流程,在开发清单上进行了讨论.
首先,该命令镜像了您在Python代码中嵌套for循环和if语句的顺序:
for k in lista:
for j in k:
for i in j:
Run Code Online (Sandbox Code Playgroud)
如果您已经习惯了这种排序,这将非常自然.
在关于该功能的最初讨论中,似乎有其他语言的先例用于排序.事实上,Haskell具有相同的顺序:每个连续的生成器都会优化前一个生成器的结果.
当然,Tim Peters(提案的创始人)在某些时候表示今天使用的订单对他来说是显而易见的,请看这篇文章:
我已经将我提出的翻译已经发布到今天的Python中了几次,意图是字面意思,而不是暗示性的.这会将最左边的"for"循环嵌套,所以在所有级别上都有关于排序语义的所有内容.为什么这成为各个层面的辩论点超出了我的范围.