【发布时间】:2014-02-10 12:30:15
【问题描述】:
当我测试and 和or 之间的区别时,我遇到了这个问题。你能帮我理解一下吗?
【问题讨论】:
-
与其他一些语言不同,Python 中的
and和or运算符不返回布尔值。 -
有关关键字的帮助,例如
and,你可以在控制台输入help("and"),这解释了and和or返回的内容。
标签: python
当我测试and 和or 之间的区别时,我遇到了这个问题。你能帮我理解一下吗?
【问题讨论】:
and 和 or 运算符不返回布尔值。
and,你可以在控制台输入help("and"),这解释了and和or返回的内容。
标签: python
是的,and 运算符要求所有参数为真,并返回最后一个检查的参数,即 5。(如果任何参数为假,它将返回第一个假值,因为那将是最后一个检查是为了验证所有参数是否为真。)
or 运算符只需要一个参数为真,并返回最后一个检查的参数,即 4,因为 4 表示条件中的第一个真值。 (如果所有参数都是假的,那么返回值将等于最后一个假值,因为这将是最后一个检查的值,以验证任何参数是否为真。)
【讨论】:
or 短路。如果左侧操作数为 Falsey,and 也可以短路。
true1 and true2 >>>true2
true1 or true2 >>>true1
在运行 true1 和 true2 时,python 必须检查每个表达式返回的值是否为真,所以它会返回最后一个。
但在运行 true1 或 true2 时,因为 true1 已经返回“true”(在您的示例中,4 为“true”),因此无需继续检查其余部分。
【讨论】:
这种行为是一个奇怪的怪癖,它来自 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
【讨论】:
我认为看待它的方式是在一个更简单的层面上,这是为优化而设计的。
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()!
【讨论】: