python中的for循环和if语句

python中的for循环和if语句,python,for-loop,if-statement,Python,For Loop,If Statement,我被下面的代码弄糊涂了。它们看起来相似,但工作方式不同 我能理解为什么第一个有效。有人能解释一下为什么其他人工作或不工作吗?非常感谢 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])

我被下面的代码弄糊涂了。它们看起来相似,但工作方式不同

我能理解为什么第一个有效。有人能解释一下为什么其他人工作或不工作吗?非常感谢

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
列表末尾的if子句是的一部分,用于过滤元素。使用else是没有意义的,因为它实际上只是一个谓词,用于指定是否包含元素


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

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

>>> [
    x 
    for x in range(1, 11)
]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
这是最简单的形式。我们在1,11范围内每取一个x。进入列表的是x本身

现在我们在迭代x的完全相同的值,但我们并不是简单地把x放入理解中。相反,如果x%2==0,则进入列表的是x,否则为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,因为条件的作用已经定义;没有代码块可执行,也没有其他可替代的方法。if包含此值,else不包含此值


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

为什么说最后一个不起作用?@Samwise第一个是引用。最后一个不会产生相同的结果。所以它不起作用。虽然倒数第二个也不起作用,尽管它声称可以。但是倒数第二个产生了不同的结果,它说这是有效的。在文档中称为a。末尾的if称为if子句。
>>> [
    x
    for x in range(1, 11)
    if x % 2 == 0
]
[2, 4, 6, 8, 10]