在Python中是否有特纳利条件操作器?


当前回答

你可以把它分成一个<unk>子:

(falseValue, trueValue)[test]

测试需要返回真实或虚假. 它可能更安全地总是执行它如下:

(falseValue, trueValue)[test == True]

或者您可以使用内置的 bool() 来确保 Boolean 值:

(falseValue, trueValue)[bool(<expression>)]

其他回答

做事的神秘方式:

"true" if var else "false"

但是,总是有不同的方式来做一个温和的状态:

"true" and var or "false"

不幸的是,该

(falseValue, trueValue)[test]

解决方案没有短循环行为;因此,无论情况如何,FalseValue和 trueValue都被评估,这可能是低优化或甚至错误(即 trueValue和 falseValue都可能是方法,并且有副作用)。

其中一个解决方案将是

(lambda: falseValue, lambda: trueValue)[test]()

(执行延迟到获胜者知道;)),但它引入可称和不可称的对象之间的不一致性。

因此,故事正在进行 - 选择上述三个解决方案是使用至少Python 2.5(IMHO,不再是一个问题)和不倾向于“真实价值评估到虚假”错误之间的交换。

你可能经常发现

cond and on_true or on_false

但这会导致一个问题,当 on_true == 0

>>> x = 0
>>> print x == 0 and 0 or 1
1
>>> x = 1
>>> print x == 0 and 0 or 1
1

在哪里你会期望这个结果为一个正常的特纳利运营商:

>>> x = 0
>>> print 0 if x == 0 else 1
0
>>> x = 1
>>> print 0 if x == 0 else 1
1

Vinko Vrsalovic的答案是足够好的,只有一件事:

請注意,條件是表達,而不是表達,這意味著您無法在條件表達內使用任命表達或通過或其他表達。

华鲁斯操作员在Python 3.8

在Walrus操作器在Python 3.8中引入后,有些事情发生了变化。

(a := 3) if True else (b := 5)

给 a = 3 和 b 不定义,

(a := 3) if False else (b := 5)

给 a 不定义 和 b = 5 和

c = (a := 3) if False else (b := 5)

给 c = 5, a 不定义, b = 5 。

即使这可能是丑陋的,任务可以在Python 3.8之后的条件表达中进行。

我发现默认的Python合成val = a if cond other b cumbersome,所以有时我这样做:

iif = lambda (cond, a, b): a if cond else b
# So I can then use it like:
val = iif(cond, a, b)

当然,它有一个缺点,总是评估双方(a和b),但合成对我来说更清楚。