我想知道列表推导是否具有任何特殊的求值顺序,从而使它们无法在普通的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 )
进行评估的事物。
答案 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
),因此它对条件不执行任何操作。第二个代码段更具可读性,因为您的意图很清楚。