列表推导中的多个 if/else

Multiple if/else on list comprehensions

我正在尝试学习列表理解和在可迭代对象上使用条件。我不明白我的 if/else 条件在这个列表上是如何工作的。 ifelse 哪个先工作并打印?

num1 = [5, 10, 15]
num2 = [i**2 if i == 10 else i - 5 if i < 7 else i + 5 for i in num1]
print(num2)

输出:

[0, 100, 20]

你在这里得到的不是带条件的列表推导(过滤掉推导的一些元素),而是 post-expression conditional

x = A if (condition) else B

如果(条件)为真,则赋值A,否则赋值B。(语法看起来有点混乱,必须承认,但即使是Python也不总是完美的。)你我设法将其中两个堆叠在一起,如下所示:

i**2 if i == 10 else (i-5 if i < 7 else i+5)

从右边读:如果 i<7,表达式 (i-5 if i < 7 else i+5) 将得到 i-5,否则得到 i+5。无论这是什么值,只要 i==10 为假(因此,对于第一个和第三个列表元素),它就会包含在理解中。

请注意,此构造与列表理解无关;您可以在任何地方使用它(只要定义了 i)。

i = 31
x = i**2 if i == 10 else (i-5 if i < 7 else i+5)

为了比较,这是一个真实的条件列表理解:理解将删除等于 10 的值,在结果中留下两个元素。我认为这就是你要理解的结构。

num3 = [ i**2 for i in num1 if i != 10 ]

要真正了解嵌套三元组的工作原理,您可以编写等效的分支语句:

num2 = []
for i in num1:
    val = i
    if i == 10:
        val **= 2
    elif i < 7:
        val -= 5
    else:
        val += 5
    num2.append(val)

请注意,无论 i 是什么,val 总是被赋值。这是三元表达式的要求。

一般来说,三元表达式遵循以下形式

x = expr_if_true if some_condition else expr_if_false

相当于

if some_condition:
    x = expr_if_true
else:
    x = expr_if_false

请注意 expr_if_trueexpr_if_false 可以是 任何有效的 Python 表达式,包括其他三元表达式。这是三元表达式可以嵌套的机制,这特别有效,因为三元表达式 always 有一个 return 值。

综上所述,这是一种糟糕的代码编写方式。三元表达式应该限制在单层,MAYBE 一层嵌套,如果它可以写得简洁易读。