为什么 Python 列表理解过滤器对 if-else 有不同的语法

Eli*_*noo 2 python list-comprehension python-3.x

在过去的一周里,我一直在提高我的 Python 编程技能,并遇到了列表理解的条件过滤,这证明非常有用。然而,为了添加一个else子句IF滤波器,蟒需要不同的语法,如下图所示:

没有 else 子句的列表理解过滤器

squares = [x**2 for x in range(20) if x % 2 == 0]
Run Code Online (Sandbox Code Playgroud)

带有 else 子句的列表理解过滤器

squares = [x**2 if x % 2 == 0 else x + 3 for x in range(20)]
Run Code Online (Sandbox Code Playgroud)

if-else 子句必须移到表达式之后的列表推导式的开头 x**2

有人可以解释为什么会这样吗?

这里的问题if/else 在列表理解中?询问如何做到这一点,我知道。我的问题是为什么会这样。

Lag*_*aer 6

这是你的一个轻微的误解。

您的第一行是带有过滤器的列表理解。它只为那些 xs 建立一个 x 的平方列表x % 2 == 0

您的第二行不是带有过滤器的列表理解。这只是使用三元运算符的普通未过滤列表理解。在这种情况下,它不是一个子句,而是一个表达式。它说:对于每个 x in range(20),计算这个表达式并将结果值放在列表中。