我认为您对文档所说的内容感到困惑。看看这两个文档部分:Truth Value Testing 和 Boolean Operators。引用第一部分的最后一段:
除非另有说明,否则具有布尔结果的操作和内置函数始终返回 0
或 False
为假和 1
或 为真。True
(重要的例外:布尔运算 总是返回它们or
的 and
操作数之一。)
如您所见,您对操作和内置函数是正确的,但请参阅重要异常部分,明确说明布尔运算符将返回其操作数之一。
现在,他们能返回什么几乎不取决于操作者的短路逻辑。对于or
运算符,它将返回表达式中的第一个真值,因为当它找到一个时,整个表达式为真。如果每个操作数都是false,or
将返回最后一个操作数,这意味着迭代每个操作数都无法找到真实的操作数。
对于and
运算符,如果表达式为真,则返回最后一个操作数,如果表达式为假,则返回第一个假操作数。您可以在 Wikipedia 页面上阅读有关短路评估的更多信息。
您的问题中有很多示例,让我们分析其中的一些示例:
>>> False and 1 # return false (short circuited at first falsey value)
False
>>> True and 1 # return 1 (never short circuited and return the last truthy value)
1
>>> 1 and False # return false (short circuited at first falsey value, in this case the last operand)
False
>>> 1 and True # return True (never short circuited and return the last truthy value)
True
>>> True and 121 # return 121 (never short circuited and return the last truthy value)
121
>>> False or 1 # return 1 (since the first operand was falsey, or kept looking for a first truthy value which happened to be the last operator)
1
>>> False or 112 # return 112 for same reason as above
112
>>> False or "Khadijah" # return "Khadijah" for same reason as above
'Khadijah'
>>> True and 'Khadijah' # return "Khadijah" because same reason as second example
'Khadijah'
我认为这应该说明问题。为了帮助您进一步理解为什么这很有用,请考虑以下示例:
你有一个随机生成名字的函数
import random
def generate_name():
return random.choice(['John', 'Carl', 'Tiffany'])
并且您有一个变量,您不知道它是否已经分配了名称,所以不要这样做:
if var is None:
var = generate_name()
你可以做oneliner:
var = var or generate_name()
由于None
是一个假值,or
将继续其搜索并评估第二个操作数,即调用最终返回生成名称的函数。这是一个非常愚蠢的例子,我见过这种风格的更好用法(虽然不是在 Python 中)。我现在想不出更好的例子。你也可以看看这个问题,关于这个话题有非常有用的答案:Python是否支持短路?
最后但同样重要的是,这与静态类型、鸭子类型、动态、解释、编译等任何语言无关。它只是一种语言功能,可能会派上用场,而且很常见,因为我能想到的几乎所有编程语言都提供此功能。
希望这可以帮助!