我对以下代码感到困惑。它们看起来相似,但工作方式不同。
我可以理解为什么 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
答案 0 :(得分:1)
列表理解末尾的if
子句是comprehension syntax的一部分,用于过滤元素。拥有一个else
是没有意义的,因为它实际上只是指定是否包含该元素的谓词。
列表理解的第一部分中的if
是conditional 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
,以指定条件不成立时该值变成什么。