X 和 Y 或 Z - 三元运算符
Posted
技术标签:
【中文标题】X 和 Y 或 Z - 三元运算符【英文标题】:X and Y or Z - ternary operator 【发布时间】:2016-12-29 01:22:09 【问题描述】:在 Java 或 C 中,我们有 <condition> ? X : Y
,将其转换为 Python 为 X if <condition> else Y
。
但也有这个小技巧:<condition> and X or Y
。
虽然我知道它相当于前面提到的三元运算符,但我发现很难掌握 and
和 or
运算符如何能够产生正确的结果。这背后的逻辑是什么?
【问题讨论】:
相关有用信息,表达式<condition> and X
将解析为X
(或False
,如果<condition>
是False
)。类似于or
运算符的工作方式。所以它是两个运算符的组合,而不是特殊的语法。
解释在这里,一旦你分解了过程的步骤:Python's Logical Operator AND
您可能会发现this answer 很有帮助。
【参考方案1】:
我认为首先它会检查 <condition>
是否为 True
然后执行 X
并跳过执行 Y
如果 X
评估为 True
但是如果<condition>
失败,那么它会跳过执行X
并执行OR 语句并执行Y
。
【讨论】:
【参考方案2】:如果我们检查A and B
,则仅当A
为True
时才会评估B
。
像这样,在A or B
中,B
只会在A
是False
的情况下进行评估。
因此,如果<condition>
是True
和Y
如果<condition>
是False
,<condition> and X or Y
将返回X
。这是短路的结果,而且and
优先于or
。
但是,您应该小心使用这种方法。如果X
本身被评估为False
(例如空字符串、列表或0
),则<condition> and X or Y
将返回Y
,即使<condition>
是True
:
X = 1
Y = 2
print(True and X or Y)
>> 1
相比:
X = 0 # or '' or []
Y = 2
print(True and X or Y)
>> 2
【讨论】:
【参考方案3】:这利用了and
的优先级高于or
这一事实。
所以<condition> and X or Y
基本上是(<condition> and X) or Y
。如果<condition> and X
评估为True
,则无需进一步评估,因为任何True or Y
都是True
。如果<condition> and X
计算结果为False
,则返回Y,因为False or Y
基本上是Y
。
【讨论】:
【参考方案4】:诀窍是python布尔运算符work
表达式
x and y
首先计算x
;如果x
为假,则返回其值;否则,将评估y
并返回结果值。表达式
x or y
首先计算x
;如果x
为真,则返回其值;否则,将评估y
并返回结果值。
【讨论】:
【参考方案5】:虽然我理解它相当于前面提到的三元 运营商
这是不正确的:
In [32]: True and 0 or 1
Out[32]: 1
In [33]: True and 2 or 1
Out[33]: 2
为什么第一个表达式返回1
(即Y
),而条件是True
,而“预期”的答案是0
(即X
)?
根据文档:
表达式 x 和 y 首先计算 x;如果 x 为假,则其值为 回来;否则,对 y 求值,结果值为 返回。
表达式 x 或 y 首先计算 x;如果 x 为真,则其值为 回来;否则,对 y 求值,结果值为 返回。
因此,True and 0 or 1
计算 and
运算符的第一个参数,即 True
。然后它返回第二个参数,即0
。
由于True and 0
返回false 值,or
运算符返回第二个参数(即1
)
【讨论】:
以上是关于X 和 Y 或 Z - 三元运算符的主要内容,如果未能解决你的问题,请参考以下文章