我最近一直在学习和使用Python,并且遇到了以下代码,我被告知这是Python中三元表达式的常用简写:
x = condition and expression1 or expression2
现在我熟悉C语言中的? :
运算符,以及Python常用的三元表达式x = expression1 if condition else expression2
,但这个新表达式对我来说有点奇怪。
我的一部分困惑是,它看起来似乎不太可读,即当我读到该行时,它并没有立即清楚地说明发生了什么,但另一部分是我不太明白它为何起作用
总结:为什么上面的表达式与C-like三元表达式的功能相同?
答案 0 :(得分:3)
当且仅当左操作数为真时,and
运算符才会计算其右操作数(expression1
)。同样,or
运算符仅当其左操作数为false时才计算其右操作数(expression2
)。
因此,如果condition
为真,则会expression1
进行评估。假设它评估为真实的东西,表达式condition and expression1
将为真,因此expression2
将不会被评估。
如果condition
为false,则expression1
不会被评估,condition and expression1
为false。因此,expression2
将被评估。
唯一的问题是如果condition
为真,但expression1
评估为某些虚假的东西。在这种情况下,将评估expression1
和expression2
。因此,当这种可能性被破坏时,这种结构就会被打破。
答案 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