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

问题描述 投票:0回答:1

我想知道列表推导是否有任何特殊的评估顺序,使得它们无法在正常的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 )中计算的东西。

python list-comprehension lazy-evaluation
1个回答
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),因此它对条件没有任何作用。第二个代码片段更具可读性,因为它清楚你的意图是什么。

© www.soinside.com 2019 - 2024. All rights reserved.