布尔运算

时间:2012-05-06 22:39:59

标签: python python-2.7

我对Python如何评估布尔语句感到困惑。

对于前。

False and 2 or 3

返回3

如何评估?我认为Python首先看'False和2',并且在没有看'或3'的情况下返回False。 Python在这里看到的顺序是什么?

另一个是:

1 or False and 2 or 2 and 0 or 0

返回1

从我从第一个例子中收集到的,我认为Python将从左到右进行评估,因此'1或False'将返回1,然后'1和2'将返回2,然后'2或2'将返回前2,然后'2和0'将返回0,然后'0或0'将返回第二个0。

你可以告诉我在这里非常困惑,请帮忙!

谢谢!

5 个答案:

答案 0 :(得分:10)

and的优先级高于or

False and 2 or 3

评估为

((False and 2) or 3)

由于第一部分(False and 2)False,Python必须评估第二部分以查看整个条件是否仍然可以成为True。它可以,因为3计算结果为True,所以返回此操作数。

类似于1 or False and 2 or 2 and 0 or 0,评估为

(1 or ((False and 2) or ((2 and 0) or 0)))

由于1的计算结果为True,因此无论其他操作数具有哪个值,整个条件都将为True。 Python可以在此时停止评估,并再次返回确定最终值的操作数。

确定最终结果的最早结果称为short-circuit evaluation,可以描述如下:

每当确定表达式的最终结果时,停止评估,并在Python中返回确定最终值的操作数的值。也就是说,假设从左到右的评估:

  • 表示and运算符,最左边的操作数,其值为False(或最后一个)
  • 表示or运算符,最左边的操作数,其值为True(或最后一个)

答案 1 :(得分:3)

这里的问题是有一个评估订单,and has a higher precedence than or。因此,它们在这里从左到右进行评估。

鉴于此,False and 2 or 3为python,(False and 2) or 3 - 因此评估为False or True,然后评估为True

在下一个示例中,Python短路,1 or False评估为True 1,因此返回1。其余的从未得到评估。这很有道理,好像or的一部分是True,你知道整个事情必须 - 所以为什么还要做额外的工作呢?

检查这个的一个好方法是定义打印的函数:

>>> def test(x):
...     print("Test: "+str(x))
...     return x
... 
>>> test(1) or test(0) or test(3)
Test: 1
1
>>> test(0) or test(0) or test(3)
Test: 0
Test: 0
Test: 3
3
>>> test(False) and test(2) or test(3)
Test: False
Test: 3
3
>>> test(1) or test(False) and test(2) or test(2) and test(0) or test(0)
Test: 1
1

这样可以很容易地看到评估的内容和顺序。

答案 2 :(得分:3)

请查看本页第5.15节:http://docs.python.org/reference/expressions.html

or的优先级低于and,因此您的语句评估为

(false and 2) or 3

答案 3 :(得分:2)

我在python docs页面上读了一段时间。如果我找到了,我会发布参考文献。 它陈述了一些内容,在一个布尔语句中,Python将返回第一个True对象。因此....并且用False预先堕落,但是或者只有一个参数,即3(真)。

答案 4 :(得分:2)

评估如下:

result = (False and 2) or 3

所以基本上如果False and 2为true-ish,则返回,否则返回3