为什么这种“和 - 或”三元表达式语法有效?

时间:2014-04-13 11:18:53

标签: python ternary-operator

我最近一直在学习和使用Python,并且遇到了以下代码,我被告知这是Python中三元表达式的常用简写:

x = condition and expression1 or expression2

现在我熟悉C语言中的? :运算符,以及Python常用的三元表达式x = expression1 if condition else expression2,但这个新表达式对我来说有点奇怪。

我的一部分困惑是,它看起来似乎不太可读,即当我读到该行时,它并没有立即清楚地说明发生了什么,但另一部分是我不太明白它为何起作用

总结:为什么上面的表达式与C-like三元表达式的功能相同?

3 个答案:

答案 0 :(得分:3)

当且仅当左操作数为真时,and运算符才会计算其右操作数(expression1)。同样,or运算符仅当其左操作数为false时才计算其右操作数(expression2)。

因此,如果condition为真,则会expression1进行评估。假设它评估为真实的东西,表达式condition and expression1将为真,因此expression2将不会被评估。

如果condition为false,则expression1不会被评估,condition and expression1为false。因此,expression2将被评估。

唯一的问题是如果condition为真,但expression1评估为某些虚假的东西。在这种情况下,将评估expression1expression2。因此,当这种可能性被破坏时,这种结构就会被打破。

答案 1 :(得分:1)

这在Python中有效的真正原因是这些运算符被短路并且执行是从左到右。如果已经有足够的信息来回答布尔表达式,则不执行其余的操作数。如果expression1返回false,它将无法按预期工作,它将执行两个表达式。

最常见的用法是只有一个操作符的语句

condition and expression

如果expression为真,则评估condition,如果or为假,使用expression的相关语句将执行condition

这并不适用于所有语言,例如APL会评估所有操作数。

答案 2 :(得分:0)

and运算符返回左操作数(如果它是假的)和右操作数,如果左操作数是真的。

对话or运算符返回左操作数(如果它是真实的)和右操作数(如果左操作数是假的)。

示例:

>>> [] and "test"  # [] is falsy
[]
>>> [] or "test"
"test"
>>> "foo" and "bar"  # "foo" is truthy
"bar"
>>> "foo" or "bar"
"foo"

正如其他人所指出的,这两种结构并不等同:

>>> True and 0 or 1
1
>>> 0 if True else 1
0