Python:和/或运算符奇怪的行为

时间:2013-12-27 09:32:59

标签: python operators operator-precedence

我知道AND运算符优先于OR运算符。我也相信,就像在C / CPP中一样,这些算子的相关性是从左到右(尽管对我的问题似乎并不重要)。

我在Python 2.7.1中运行以下代码:

案例1:

我有三个功能:

def f(): print 3; return True

def g(): print 4; return False

def h(): print 5; return False

当我运行以下命令时

f() and g() or h()

我得到了

3
4
5
False

这很好(我的预期)。

案例2:

如果我将功能更改为:

def f(): print 3

def g(): print 4

def h(): print 5

我得到同样的命令:

3
5

案例3:

如果我将命令更改为

 f() and (g() or h())

我只得到:

 3

我知道在最后两个例子中,函数实际上并没有返回布尔值,但是 - 我不明白这种行为。它似乎不一致:

我们将函数f(),h(),g()称为True还是False或其他什么(什么?)?

为什么在第二种情况下,h()运行而不是g()?

为什么在最后一种情况下(g和h)都没有运行?

2 个答案:

答案 0 :(得分:4)

在Python中,没有显式返回任何内容的函数会返回None。在布尔上下文中,None被视为false。

在第二个示例中,由于g运算符short-circuitsand无法运行。 f的结果为false,因此g()不需要进行评估,因为其结果不会更改整个and表达式的结果。

同样,在第三个示例中,由于f()为false,因此and的右侧不需要进行评估,因此gh不要不跑。

答案 1 :(得分:1)

这里,由于所有函数都返回None,当你说f() and g() or h()时,函数g()永远不会被评估。这是因为and的第一个操作数是False。但是h()被评估,因为第一个操作数是或False

注意:f() and g() or h()(f() and g()) or h()

相同

http://docs.python.org/2/reference/expressions.html#boolean-operations

相关问题