列表理解在python中是如何计算的以及以什么顺序计算的

列表理解在python中是如何计算的以及以什么顺序计算的,python,list-comprehension,Python,List Comprehension,我有两个列表理解,其中条件定义在不同的地方 >>> [ x**2 if x%2==0 else x**3 if x%3==0 else 0 for x in range(10)] [0, 0, 4, 27, 16, 0, 36, 0, 64, 729] >>> [ x**2 if x%2==0 for x in range(10) ] File "<stdin>", line 1 [ x**2 if x%2==0 for x in r

我有两个列表理解,其中条件定义在不同的地方

>>> [ x**2 if x%2==0 else x**3 if x%3==0 else 0 for x in range(10)]
[0, 0, 4, 27, 16, 0, 36, 0, 64, 729]

>>> [ x**2 if x%2==0 for x in range(10) ]
  File "<stdin>", line 1
    [ x**2 if x%2==0 for x in range(10) ]
                       ^
SyntaxError: invalid syntax
它起作用了


现在,令人困惑的部分是如何计算顺序。区别是什么?

您混淆了两种完全不同的结构

列表理解的条件只能在最后的一个平面上定义,它们的作用类似于过滤器:

您看到的另一个构造是python版本的。它不是过滤器,它只是根据第三个表达式的逻辑值选择其中一个表达式:

... if ... else ...
从:

列表由包含表达式的括号组成 后跟for子句,然后是零个或多个for或if子句。这个 结果将是在中计算表达式后生成的新列表 后面的for和if子句的上下文


因此,根据定义,
如果
位于的
之后,那么这里就混淆了两个不同的概念

如果x%2==0,则类似于
x**2的表达式是一个条件表达式。它们可以链接,但是
else
不是可选的,因为这是一个独立的表达式,其计算结果为单个特定值。
else x**3
是必需的,因为只要不是
x%2==0
的情况,Python就必须知道表达式的计算结果

在列表理解中,当您编写诸如
[x**2 for x In range(10)if x%2==0]
之类的内容时,
if
子句用于过滤在范围(10)
中找到的
x
值,
用于计算结果列表的哪些元素。此处不允许使用
其他
,因为目的完全不同

您可以混合搭配:
[x**2如果x%2==0,则为x**3;如果x%3==0,则为范围内的x**3]
。现在,
如果x%3==0
用于决定计算结果的
x
值,如果x%2==0
用于决定是否使用
x**2
x**3
作为那些
x
的计算结果。例如,这:

[ x**2 if x%2==0 else x**3 if x%3==0 else 0 for x in range(10)]
与此等效:

>>> l = []
>>> for x in range(10):
...     l.append(x**2 if x%2==0 else x**3 if x%3==0 else 0)
... 
>>> l
[0, 0, 4, 27, 16, 0, 36, 0, 64, 729]
也就是说,没有
if
语句,而是
if
表达式。因此,对于
,在
的每个步骤上,列表中总是会添加一些内容

但是,当您执行此操作时:

[ x**2 for x in range(10) if x%2==0 ]
if
语句将被使用。并不是所有的步骤都会附加到列表中。翻译成:

>>> l = []
>>> for x in range(10):
...     if x%2==0:
...             l.append(x**2)
... 
>>> l
[0, 4, 16, 36, 64]

列表中的
if
可以放在除第一个
for
之前的任何位置:
[x代表[1,2,3]中的x如果x<2如果x<4代表[x]中的j]
它不是a,否则不是可选的
[ x**2 for x in range(10) if x%2==0 ]
>>> l = []
>>> for x in range(10):
...     if x%2==0:
...             l.append(x**2)
... 
>>> l
[0, 4, 16, 36, 64]