为什么'和'&'或'在Python中返回操作数?

Kha*_*ine 14 python boolean operands

我正在经历LPTHW,我遇到了一些我无法理解的东西.什么时候你想要你的布尔值andor返回布尔值以外的东西?LPTHW文本指出像python这样的所有语言都有这种行为.他的意思是解释与编译语言或鸭类型与静态类型语言?

我运行了以下代码:

>>> False and 1
False
>>> True and 1
1
>>> 1 and False
False
>>> 1 and True
True
>>> True and 121
121
>>> False or 1
1
>>> False or 112
112
>>> False or "Khadijah"
'Khadijah'
>>> True and 'Khadijah'
'Khadijah'
>>> False or 'b'
'b'
>>> b = (1, 2, "K")
>>> b
(1, 2, 'K')
>>> False or b
(1, 2, 'K')
>>> 
Run Code Online (Sandbox Code Playgroud)

请帮我理解这里发生的事情.

根据文档:http://docs.python.org/2/library/stdtypes.html

除非另有说明,否则具有布尔结果的操作和内置函数始终返回0或返回Falsefalse 1True为true.(重要的例外:布尔运算orand始终返回其中一个操作数.)

根据LPTHW:http://learnpythonthehardway.org/book/ex28.html 为什么"test" and "test"返回"test"或1 and 1返回1而不是True?Python和许多类似的语言将其中一个操作数返回到它们的布尔表达式而不仅仅是True或False.这意味着如果你做了False而你得到了第一个操作数(False),但是如果你做了True而得到了你得到第二个(1).玩这个有点.

Pau*_* Bu 13

我认为你对文档所说的内容感到困惑.看看这两个文档部分:真值测试和布尔运算符.引用第一节的最后一段:

除非另有说明,具有布尔结果的操作和内置函数总是返回0或False表示false,1或True表示true.(重要的例外:布尔运算或者并且始终返回其中一个操作数.)

正如您所看到的,您对操作和内置函数是正确的,但是请参阅重要的异常部分,可以说布尔运算符将返回其中一个操作数.

现在,它们可以返回的内容几乎不取决于运营商的短路逻辑.对于or运算符,它将返回表达式中的第一个truthy值,因为当它找到一个时,整个表达式为真.在每个操作数都是假的情况下,or将返回最后一个操作数,这意味着它迭代在它们中的每一个上都无法找到真正的操作数.

对于andoperator,如果表达式为true,则返回最后一个操作数,如果表达式为false,则返回第一个falsey操作数.您可以在维基百科页面上阅读有关短路评估的更多信息.

你的问题中有很多例子,我们来分析一下:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

我认为这应该说明一点.为了帮助您进一步了解其有用的原因,请考虑以下示例:

您有一个随机生成名称的函数

import random

def generate_name():
    return random.choice(['John', 'Carl', 'Tiffany'])
Run Code Online (Sandbox Code Playgroud)

并且你有一个变量,你不知道它是否已经分配了一个名称而不是这样做:

if var is None:
    var = generate_name()
Run Code Online (Sandbox Code Playgroud)

你可以做oneliner:

var = var or generate_name()
Run Code Online (Sandbox Code Playgroud)

由于None是一个假值,or将继续其搜索并评估第二个操作数,这就是调用函数最终返回生成的名称.这是一个非常愚蠢的例子,我已经看到了这种风格的更好用法(尽管不是Python).我现在无法提出一个更好的例子.你也可以看一下这个问题,关于这个主题有非常有用的答案:Python是否支持短路?

最后但并非最不重要的是,这与静态类型,鸭类型,动态,解释,编译,无论何种语言无关.它只是一种语言功能,可能会派上用场,这很常见,因为我能想到的几乎所有编程语言都提供此功能.

希望这可以帮助!