for循环和python中的if语句

时间:2020-05-18 21:38:46

标签: python for-loop if-statement

我对以下代码感到困惑。它们看起来相似,但工作方式不同。

我可以理解为什么 first 起作用的原因。有人可以请别人解释为什么别人起作用或不起作用吗?非常感谢。

print([x for x in range(1, 11) if x % 2 == 0]) # This works

print([x if x % 2 == 0 else 0 for x in range(1, 11)]) # This works

print([x for x in range(1, 11) if x % 2 == 0 else 0]) # Not work

print([x if x % 2 == 0 for x in range(1, 11)]) # Not work

print([x if x % 2 == 0 else -x for x in range(1, 11)]) # This works

2 个答案:

答案 0 :(得分:1)

列表理解末尾的if子句是comprehension syntax的一部分,用于过滤元素。拥有一个else是没有意义的,因为它实际上只是指定是否包含该元素的谓词。

列表理解的第一部分中的ifconditional expression的一部分。它必须具有else才能在语法上有效,但它不是过滤器:它不用于从理解中排除元素,而是根据条件指定不同的值。

答案 1 :(得分:0)

我认为,如果您逐段构建表达式,最容易理解。

>>> [
    x 
    for x in range(1, 11)
]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

这是最简单的形式。我们正在提取x中的每个range(1, 11)。进入列表的是x本身。

>>> [
    x if x % 2 == 0 else 0 
    for x in range(1, 11)
]
[0, 2, 0, 4, 0, 6, 0, 8, 0, 10]

现在,我们要遍历x的完全相同的值,但我们并不仅仅是将x放入理解中。相反,进入列表的是x if x % 2 == 0 else 0。我们仍然拥有与上一个示例相同的数量的值,但是现在所有的赔率值都已转换为0。

>>> [
    x
    for x in range(1, 11)
    if x % 2 == 0
]
[2, 4, 6, 8, 10]

现在,我们回到仅将x放在理解结果中,但是我们从迭代中消除了其他所有x。请注意,if放在表达式的末尾(在for...in部分之后),其唯一功能是过滤x在表达式的开头接收哪些值(它可以请勿将其替换为其他内容,而只能包含或排除它们)。这就是为什么我们现在只有一半的值。

我们不能在过滤器表达式的末尾添加else,因为条件已经定义。没有要执行的代码块,也没有else可以替代。 if是“包括此值”,而else是“不包括此值”。

类似地,如果我们在表达式的开头使用if,则必须包含一个else,以指定条件不成立时该值变成什么。

相关问题