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

虽然我知道它相当于前面提到的三元运算符,但我发现很难掌握 andor 运算符如何能够产生正确的结果。这背后的逻辑是什么?

【问题讨论】:

相关有用信息,表达式<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,则仅当ATrue 时才会评估B

像这样,在A or B 中,B 只会在AFalse 的情况下进行评估。

因此,如果<condition>TrueY 如果<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 - 三元运算符的主要内容,如果未能解决你的问题,请参考以下文章

三元运算符

python 三元运算与lambda

python中的lambda表达式与三元运算

Python基础-lambda表达式与三元运算

9.22 xor三元组计数

返回引用时的 C++ 三元运算符