如果你有一个if语句,其中评估了几个变量或函数,它们的评估顺序是什么?
if foo > 5 or bar > 6:
print 'foobar'
在这个特定的情况下,将foo对5进行评估,然后对6进行评估(从左到右)还是从右到左进行评估?我假设or
和and
按照相同的顺序进行评估。
答案 0 :(得分:24)
首先评估左子句,然后仅在第一个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
否则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 5
和5 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首先在表达式中具有最高优先级的运算符 执行然后进一步执行。