在Python中评估if语句的顺序

时间:2013-04-24 20:16:23

标签: python

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

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

在这个特定的情况下,将foo对5进行评估,然后对6进行评估(从左到右)还是从右到左进行评估?我假设orand按照相同的顺序进行评估。

5 个答案:

答案 0 :(得分:24)

首先评估左子句,然后仅在第一个False时评估右子句。

这就是为什么你可以做的事情:

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

没有它破坏。

相反,使用and子句,只有在第一个Trueif person and person.name: # ... 时才会评估右子句:

person

否则None为{{1}}时会抛出异常。

答案 1 :(得分:7)

将从左到右进行评估。

>>> 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

答案 2 :(得分:4)

为了进一步扩展Blender的解释,or运算符还内置了其他内容:

<expression A> or <expression B>

这将首先评估expression A;如果评估为True,则运营商返回expression A。因此,当5 or <something>评估为5时,5会返回True

如果expression A评估为False,则会返回expression 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将返回{{} 1}}因为3是最后一个表达式,所有内容都计算为3

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

答案 3 :(得分:1)

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

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

如果foo > 5,则bar > 6甚至不会被测试,因为True or <anything>将是True。如果foo不是> 5,则会bar > 6进行测试。

答案 4 :(得分:0)

操作员从左到右进行评估。 但仅当所有操作员的优先级相同时才可以。 当运营商的优先级不相等时 操作员将根据优先级执行。

例如。

  
    

错误或错误或正确和错误     错误

         

是非题,是非题     是

         

错误或错误以及正确或错误     错误

  

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