可以在正常的if语句中复制每个列表理解吗

时间:2019-04-27 16:31:50

标签: python list-comprehension lazy-evaluation

我想知道列表推导是否具有任何特殊的求值顺序,从而使它们无法在普通的if语句中复制:

例如,是否可以在没有列表理解的情况下编写相同的东西?如果是这样,是否可以不使用“ else”?

a, b = set(), set()
[a.add(i) for i in range(5) if i % 2 == 0 or b.add(i)]

具体地说,在这种情况下,我将演示对“或”的惰性计算,但是我无法弄清楚如何在列表理解之外进行演示,因为在普通的for循环中使用“ if”时,set.add ()是在布尔上下文中而不是实际表达式( i % 2 == 0 )进行评估的事物。

1 个答案:

答案 0 :(得分:3)

您的列表理解与:

for i in range(5):
    if i % 2 == 0 or b.add(i):
        a.add(i)

因此,if语句与列表理解没有什么不同。

您的代码可以替换为:

for i in range(5):
    if i % 2 == 0:
        a.add(i)
    else:
        b.add(i)

从阅读的角度来看,我认为您前面的示例是模棱两可的。由于b.add(i)是就地完成的,因此它将始终返回None(被解释为False),因此它对条件不执行任何操作。第二个代码段更具可读性,因为您的意图很清楚。