32

如果您有一个 if 语句,其中评估了多个变量或函数,它们的评估顺序是什么?

if foo > 5 or bar > 6:
    print 'foobar'

在这种特定情况下,是否会针对 5 评估 foo 然后针对 6(从左到右)评估 bar 还是从右到左评估它?我假设 aorand以相同的顺序进行评估。

4

5 回答 5

53

左边的子句将首先被评估,只有当第一个是 时,才会评估右边的子句False

这就是为什么您可以执行以下操作的原因:

if not person or person.name == 'Bob':
    print "You have to select a person and it can't be Bob"

没有它打破。

相反,对于一个and子句,只有当第一个子句是时才会评估正确的子句True

if person and person.name:
   # ...

person否则is时会抛出异常None

于 2013-04-24T20:18:19.673 回答
11

它将从左到右进行评估。

>>> def a():
...     print 'a'
...     return False
... 
>>> def b():
...     print 'b'
...     return False
... 
>>> print a() or b()
a
b
False
>>> def c():
...     print 'c'
...     return True
... 
>>> print c() or a()
c
True
于 2013-04-24T20:19:04.650 回答
10

为了进一步扩展 Blender 的解释,or操作符还内置了一些东西:

<expression A> or <expression B>

这将首先评估expression A;如果计算结果为Truethenexpression A则由运算符返回。所以将5 or <something>返回5为.5True

如果expression A计算结果为Falseexpression B则返回。所以0 or 5会返回5,因为0计算结果为False.

当然,您可以根据需要将其链接起来:

<expr 1> or <expr 2> or <expr 3> or ... or <expr n>

通常,or将返回计算结果为 的第一个表达式True,但保留其原始值。如果没有计算结果为 的表达式True,它将简单地返回最后一个表达式(计算结果为False)。

and操作员以类似但相反的方式工作。它将返回第一个计算结果为 的表达式False,但保留其原始值。如果没有计算结果为 的表达式False,它将简单地返回最后一个表达式(计算结果为True)。

例如,0 and 55 and 0都将返回0,因为0计算结果为False,但2 and 3将返回3,因为3是最后一个表达式并且所有内容都计算为True

无论如何(回到问题):所有表达式都是从左到右评估的,如果上面的规则允许,则不会触及其他表达式。

于 2013-04-24T21:02:47.543 回答
2

Python 的or运算符短路,它将从左到右进行评估:

if (foo > 5) or (bar > 6):
    print 'foobar'

如果foo > 5, 那么bar > 6甚至不会被测试,True or <anything>就像True. 如果foo不是> 5bar > 6则将进行测试。

于 2013-04-24T20:21:28.467 回答
1

运算符从左到右求值。但仅当所有运算符的优先级相同时。当运算符的优先级不相等时,运算符将根据优先级执行。

前任。

假或假或真假假

真或假和真或假真

假或假和真或假假

即首先在表达式中执行具有最高优先级的运算符,然后进一步执行。

于 2019-02-13T10:55:56.133 回答