我想知道列表推导是否有任何特殊的评估顺序,使得它们无法在正常的if语句中复制:
例如,是否可以在没有列表推导的情况下编写相同的内容?如果是这样,是否可以不使用“其他”?
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 )
中计算的东西。
您的列表理解与以下内容相同:
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
),因此它对条件没有任何作用。第二个代码片段更具可读性,因为它清楚你的意图是什么。