在表达式中使用逻辑运算符

Using logical operators in an expression

我正在尝试理解那段代码:

s = list()
r = string()
# actual bit of code:
print(s and 'ERROR' or r or 'EMPTY')

这是做什么的:

我现在正试图理解为什么这样做有效,以及更广泛地理解如何在表达式中使用逻辑运算符,就像在这个例子中一样。

x and yx 如果它是“false-y”(即 0FalseNone[], '', ...), 否则为 y.
如果是“truth-y”,x or y就是x,否则就是y.

x or y等同于x if x else yx and y等同于x if not x else y

如果 s 是 non-empty,s and 'ERROR' 产生真值 'ERROR',short-circuited or 表达式的其余部分。

如果 s 为空,s and 'ERROR' 产生假值 [],这导致对 r 的评估以确定整个表达式的值是否为rEMPTY.

使用 non-Boolean 参数来尝试更小的示例有助于了解 andor 是如何工作的。

>>> [] and "ERROR"
[]
>>> ["foo"] and "ERROR"
"ERROR"

这里使用条件表达式可能更清楚:

print("ERROR" if s else (r or "EMPTY"))

或者只是使用“天真的”if语句。

if s:
    print("ERROR")
elif r:
    print(r)
else:
    print("EMPTY")

这道题更侧重于逻辑运算符和Short-circuit评价 。 首先,您需要了解每个变量都有一个与之关联的布尔值。

空列表为假,长度为1或更大的列表为真。这可以使用 bool() 运算符进行检查:

>>> bool([])
False
>>> bool(['a'])
True

同样,空字符串为假,一个或多个字符的字符串为真。

>>> bool('')
False
>>> bool('string')
True

表达式s and 'ERROR' or r or 'EMPTY'计算如下:

  1. bool(s) and bool('ERROR')
  2. or
  3. bool(r)
  4. or
  5. bool('EMPTY')

当其中任何一个为真时,评估结束。这只是评估的顺序。