【问题标题】:Logical operators in PythonPython中的逻辑运算符
【发布时间】:2017-06-18 05:53:36
【问题描述】:

在阅读 python 中的逻辑运算符时,我遇到了表达式:

  5 and 1 

输出:1

  5 or 1 

输出:5

谁能解释一下这是如何工作的?
我知道 logical 运算符的 operands 是 Boolean

【问题讨论】:

  • 按位运算的结果相同。可能只是巧合
  • 这些是逻辑运算符,您可能只是将它们视为逻辑实体。在这种情况下,会发生短路。所以在或的情况下,1 或 5 为 1。不检查 5。在 5 或 1 的情况下,结果为 5(不检查 1)。在 and 的情况下,返回后面的参数。 1 和 5 = 5 而 5 和 1 = 1
  • 同样值得尝试 1 and 5 和 1 or 5 分别返回 5 和 1 并且更清楚地表明正在评估条件而不是按位结果。
  • 为了进一步理解这一点,我建议您对离散数学和命题逻辑进行一些简单的阅读;如果您有时间,this 是一个很好的参考。
  • 重新打开了这个问题,因为它比应该重复的stackoverflow.com/questions/47007680/… 更年轻。

标签: python


【解决方案1】:

那是well documented:

x or y      if x is false, then y, else x 
x and y     if x is false, then x, else y 

两者都短路(例如,如果x 是真实,or 将不会评估 y)。

文档还声明了what is considered falsy(False、0、None、空序列/映射,...) - 其他所有内容都被认为是真实的。

几个例子:

7 and 'a'             # -> 'a'
[] or None            # -> None
{'a': 1} or 'abc'[5]  # -> {'a': 1}; no IndexError raised from 'abc'[5]
False and 'abc'[5]    # -> False; no IndexError raised from 'abc'[5]

注意最后两个如何显示短路行为:第二个语句(会引发IndexError)未执行。

您关于操作数是布尔值的说法有点没有实际意义。 python 确实有布尔值(实际上只有 2 个:True 和 False;它们是 subtypes of int)。但是python中的逻辑运算只是检查操作数是truthy还是falsy。 bool function 不会在操作数上调用。


truthy 和 falsy 这两个术语似乎没有在官方 python 文档中使用。但是教python的书和这里的社区确实使用了这些术语。在english.stackexchange.com 上有关于条款的讨论,在wikipedia 上也有提及。

【讨论】:

  • 你应该提到所有非零值都是真实的
  • 一个很好的答案,有很好的例子。谢谢:-)
  • 谢谢,我明白了。
  • @ChihebNexus:谢谢夸奖!这确实是我必须(勉强)承认的更好答案之一......
  • @hiroprotagonist 是的!这个答案在我最喜欢的答案中:-) 它很有启发性。
【解决方案2】:

这是因为短路评估方法。

对于and,所有子句必须是True,因此必须对所有子句进行求值。一旦遇到False,整个事情就会评估为False,我们甚至不需要评估下一个。

>>> 1 和 2 2 >>> 2 和 1 1 >>> 1 和 2 和 3 3 >>> 1 和 0 和 2 0 >>> 0 和 1 和 2 0

但是对于or,任何子句被评估为True 就足以使整个事情成为True。所以一旦它找到了True,就决定了整个东西的值是True,甚至没有评估后面的子句。

>>> 0 或 1 1 >>> 1 或 0 1 >>> 1 或 2 1 >>> 2 或 1 2 >>> 0 或 0 或 1 1 >>> 0 或 1 或 2 1

【讨论】:

    【解决方案3】:

    这称为短路或惰性求值。例如,如果您有“a 或 b”并且 a 符合条件,则 python 将输出它。反之,如果你有 "a and b" 并且 "a" 不满足条件,那么 python 将停止评估它,因为它不能满足。

    【讨论】:

      【解决方案4】:

      在and关键字存在的第一种情况下,如果第一个数字不为零,则由第二个值确定它是否在逻辑上为真。因此最终会打印第二个值。

      在第二种情况下,当遇到第一个非零操作数时,关键字是左右,因为它使语句在逻辑上为真,所以它被打印到输出屏幕上。

      这是惰性求值的一个例子。

      【讨论】:

        猜你喜欢
        • 2013-08-14
        • 1970-01-01
        • 2018-12-18
        • 2020-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-24
        相关资源
        最近更新 更多