在Python中评估if语句的顺序

Mog*_*get 13 python

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

if foo > 5 or bar > 6:
    print 'foobar'
Run Code Online (Sandbox Code Playgroud)

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

ubi*_*bik 27

首先评估左子句,然后仅在第一个子句的情况下评估右子句False.

这就是你可以做的事情:

if not person or person.name == 'Bob':
    print "You have to select a person and it can't be Bob"
Run Code Online (Sandbox Code Playgroud)

没有它打破.

相反,对于一个and子句,只有在第一个条款是True:

if person and person.name:
   # ...
Run Code Online (Sandbox Code Playgroud)

否则,当一个异常会被抛出personNone.


Nat*_*usa 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
Run Code Online (Sandbox Code Playgroud)


pok*_*oke 6

为了进一步扩展Blender的解释,or操作员还内置了一些其他功能:

<expression A> or <expression B>
Run Code Online (Sandbox Code Playgroud)

这将expression A首先评估;如果计算结果为True,然后expression A由操作员返回。因此,5 or <something>将返回55计算结果为True

如果expression A计算为Falseexpression B则返回。因此0 or 5将返回,5因为0计算为False

当然,您可以根据需要随意链接:

<expr 1> or <expr 2> or <expr 3> or ... or <expr n>
Run Code Online (Sandbox Code Playgroud)

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

and运营商采用类似,但反转的方式。它将返回第一个表达式,其结果为False,但保留其原始值。如果没有计算结果为的表达式,False它将仅返回最后一个表达式(计算结果为True)。

举例来说,0 and 55 and 0都将返回,0因为0计算结果为False,但2 and 3将返回,3因为3是最后一个表达式,所有结果都计算为True

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