“4 和 5”是 5,“4 或 5”是 4。有啥原因吗? [复制]
Posted
技术标签:
【中文标题】“4 和 5”是 5,“4 或 5”是 4。有啥原因吗? [复制]【英文标题】:"4 and 5" is 5, while "4 or 5" is 4. Is there any reason? [duplicate]“4 和 5”是 5,“4 或 5”是 4。有什么原因吗? [复制] 【发布时间】:2014-02-10 12:30:15 【问题描述】:当我测试and
和or
之间的区别时,我遇到了这个问题。你能帮我理解一下吗?
【问题讨论】:
与其他一些语言不同,Python 中的and
和 or
运算符不返回布尔值。
有关关键字的帮助,例如and
,你可以在控制台输入help("and")
,这解释了and
和or
返回的内容。
【参考方案1】:
是的,and
运算符要求所有参数为真,并返回最后一个检查的参数,即 5。(如果任何参数为假,它将返回第一个假值,因为那将是最后一个检查是为了验证所有参数是否为真。)
or
运算符只需要一个参数为真,并返回最后一个检查的参数,即 4,因为 4 表示条件中的第一个真值。 (如果所有参数都是假的,那么返回值将等于最后一个假值,因为这将是最后一个检查的值,以验证任何参数是否为真。)
【讨论】:
而这里的白话就是“短路”。在这种情况下,or
短路。如果左侧操作数为 Falsey,and
也可以短路。【参考方案2】:
true1 and true2 >>>true2
true1 or true2 >>>true1
在运行 true1 和 true2 时,python 必须检查每个表达式返回的值是否为真,所以它会返回最后一个。
但在运行 true1 或 true2 时,因为 true1 已经返回“true”(在您的示例中,4 为“true”),因此无需继续检查其余部分。
【讨论】:
【参考方案3】:这种行为是一个奇怪的怪癖,它来自 python 代码的三个不同特性。非零值是真、逻辑运算评估和短路。我将在下面解释这些功能:
非零值为真
在评估这些表达式时,您首先要知道的是它们是逻辑运算符。它们旨在处理真值或假值:
true and true = true
true and false = false
false and true = false
false and false = false
true or true = true
true or false = true
false or true = true
false or false = false
但是,python(和许多语言)允许您输入任何值。只要它们不为零,它们就被认为是正确的。所以:
4 and 5 = true
4 and 0 = false
到目前为止这是正常的。大多数语言都有这个。
逻辑运算评估
在这里,Python 做了一些独特的事情。它实际上返回它在语句中检查的最后一项的值,而不是返回 true 或 false。所以:
4 and 5 = 5 (which will be evaluated as true)
要完全了解实际返回的值,您还必须了解:
短路
在评估这些逻辑运算符时,编译器通常会提前停止。举个例子:
3 or 4
我们知道该语句将返回 true,但它会返回哪个值?要弄清楚这一点,您必须了解哪个值将是最后一个被查看的值。系统将查看 3,并意识到该陈述是正确的。第二个值是什么并不重要,3 or anything
是真的。所以返回的值是 3,因为它是最后检查的值。
但是,如果我们使用 and:
3 and 4
一旦我们看到 3,我们仍然需要检查第二个值是否为真。它可以有所作为。因此评估第二个值。如果为真,则返回最后查看的值,在本例中为 4。
结论
您只需要考虑解释器可以停止在哪个值上。
3 or 4 = 3 // because we can stop at 3
3 and 4 = 4 // because we have to check the 4
0 or 3 = 3 // because we needed to check the 3
【讨论】:
【参考方案4】:我认为看待它的方式是在一个更简单的层面上,这是为优化而设计的。
and
要求双方都是“真实的”。它检查左侧。如果它是“真实的”,它会返回第二个值而不检查它是什么。
or
只要求一侧是“真实的”。它检查第一面。如果它是“真实的”,它会返回它。如果不是,它返回第二面,再次不检查它。
对于“4 和 5”,因为 4 是“真实的”,所以它返回 5。 对于“4 或 5”,它甚至不看 5 就返回 4。
需要证明吗?制作这些函数:
def four():
print 'Evaluating four!'
return 4
def five():
print 'Evaluating five!'
return 5
现在看看打印了什么:
>>> four() and five()
Evaluating four!
Evaluating five!
5
and
评估了four()
,因为它是真的,所以它返回了five()
。
>>> left() or right()
Evaluating left side!
4
or
评估了four()
,因为它是真的,所以返回了four()
甚至没有调用five()
!
【讨论】:
以上是关于“4 和 5”是 5,“4 或 5”是 4。有啥原因吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
ueditor php版 编辑器 上传图片和视频出现报错’服务器返回出错’ 大哥大姐知道是啥原
为啥 clickhouse 'DESCRIBE TABLE' 返回 4 或 5 列