我知道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)都没有运行?
答案 0 :(得分:4)
在Python中,没有显式返回任何内容的函数会返回None
。在布尔上下文中,None
被视为false。
在第二个示例中,由于g
运算符short-circuits,and
无法运行。 f
的结果为false,因此g()
不需要进行评估,因为其结果不会更改整个and
表达式的结果。
同样,在第三个示例中,由于f()
为false,因此and
的右侧不需要进行评估,因此g
和h
不要不跑。
答案 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