当前位置: 首页 > 面试题库 >

为什么'and'和'or'返回Python中的操作数?

马亮
2023-03-14
问题内容

我正在通过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')
>>>

请帮助我了解这里发生了什么。

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

除非另有说明,否则具有布尔结果的操作和内置函数始终返回,0或者返回Falsefalse1Truetrue。(重要的例外:布尔运算,or并且and始终返回其操作数之一。)

根据LPTHW:http
://learnpythonthehardway.org/book/ex28.html 为什么"test" and "test"返回“ test”或1 and 1返回1而不是True?Python和许多类似的语言将操作数之一返回其布尔表达式,而不仅仅是True或False。这意味着,如果执行False和1,则将获得第一个操作数(False),但是如果执行True和1,则将获得第二个操作数(1)。玩这个。


问题答案:

我认为您对文档中的内容感到困惑。看一下这两个文档部分:真值测试和布尔运算符。在第一部分引用最后一段:

除非另有说明,否则具有布尔结果的操作和内置函数总是返回0或False表示false,返回1或True表示true。(重要的例外:布尔运算符or和and始终返回其操作数之一。)

如您所见,您对运算和 内建函数 是正确 的, 但请参阅“ 重要”异常 部分,可以肯定地说,布尔运算符 将返回其操作数之一

现在,他们可以返回的收益几乎不取决于操作员的短路逻辑。对于oroperator,它将返回表达式中的第一个 真实
值,因为找到它时,整个表达式为true。如果每个操作数都是 false
or则将返回最后一个操作数,这意味着对每个操作数进行迭代都无法找到真实的操作数。

对于andoperator,如果表达式为true,则将返回最后一个操作数;如果表达式为false,则将返回第一个falsey操作数。您可以在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是否支持短路?

最后但并非最不重要的一点是,这与静态类型,鸭子类型,动态,解释,编译以及任何语言无关。它只是一种语言功能,可能会派上用场,并且非常普遍,因为我能想到的几乎每种编程语言都提供此功能

希望这可以帮助!



 类似资料:
  • 问题内容: 有人可以解释一下吗(直接来自文档-强调我的): math.ceil(x) 以浮点数形式 返回 x 的上限,最小 整 数值大于或等于x。 math.floor(x) 以浮点数形式 返回 x 的下限,即小于或等于x的最大 整 数值。 为什么会和回报花车当它们被定义应该算整数? 编辑: 好吧,这有一些很好的论据来说明为什么它们 应该 返回浮点数,而当@jcollado指出它们实际上 _确实_

  • 我正在尝试创建一个函数,其中检查给定值(作为字符串传递)以查看位数是4还是6,并且它是一个数字。 我的第一个冲动是遵循以下准则: 上面的代码只通过了下面的第一个测试…我不明白为什么它通过了这个测试,但没有通过其他测试: 只有当我分离len()函数时,它才能正常工作。 以上代码通过了所有测试。 因此,我的问题是: 这是怎么回事? 有没有办法为此编写更干净的代码? 谢谢你的帮助! **这不是一个重复的

  • 问题内容: 为什么要用返回? 我如何获得改组后的值而不是? 问题答案: 更改x列表到位。 就地更改结构的方法通常返回None,而不是修改后的数据结构。 如果要基于现有列表创建新的随机混排列表,并按顺序保留现有列表,则可以使用输入的完整长度: 你还可以将用于排序键: 但这会调用排序(操作),而采样到输入长度仅需要O(N)操作(与所使用的过程相同,即从收缩池中换出随机值)。 演示:

  • 问题内容: 我遇到了很大的麻烦,因为我需要对某些输入类型进行样式化。我有类似的东西: 但是我也不想设置复选框的样式。 我试过了: 如何使用?而且我需要尽快使用,我认为用法将是相同的。 更新: 我仍然不知道如何使用和正确。我在W3文档中找不到任何内容。 问题答案: 通过像这样将多个选择器串在一起来工作: 另一个例子: 通过使用逗号分隔多个选择器来工作,例如:

  • 主要内容:AND 运算符,OR 运算符SQL 中的 AND 和 OR 运算符用来连接多个查询条件,以缩小返回的结果集,它们被称为连接符。 AND 运算符 AND 运算符用于连接 WHERE 子句中的多个查询条件,只有当这些查询条件都被满足时,数据行(记录)才会被选取。 语法 WHERE 子句中 AND 运算符的基本语法如下: SELECT column1, column2, columnN FROM table_name WHERE

  • 首先,对我糟糕的英语水平感到抱歉。 我做的是BDT模型,但这里有些问题。 此函数是第4列的更改代码 前桌 之后的桌子 我尝试转换为循环,但不工作。 这是我的密码 循环n=2,3可以。但是循环n=4有什么问题吗 plz帮助