如果您有一个 if 语句,其中评估了多个变量或函数,它们的评估顺序是什么?
if foo > 5 or bar > 6:
print 'foobar'
在这种特定情况下,是否会针对 5 评估 foo 然后针对 6(从左到右)评估 bar 还是从右到左评估它?我假设 aor和and以相同的顺序进行评估。
如果您有一个 if 语句,其中评估了多个变量或函数,它们的评估顺序是什么?
if foo > 5 or bar > 6:
print 'foobar'
在这种特定情况下,是否会针对 5 评估 foo 然后针对 6(从左到右)评估 bar 还是从右到左评估它?我假设 aor和and以相同的顺序进行评估。
左边的子句将首先被评估,只有当第一个是 时,才会评估右边的子句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。
它将从左到右进行评估。
>>> 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
为了进一步扩展 Blender 的解释,or操作符还内置了一些东西:
<expression A> or <expression B>
这将首先评估expression A;如果计算结果为Truethenexpression A则由运算符返回。所以将5 or <something>返回5为.5True
如果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将返回3,因为3是最后一个表达式并且所有内容都计算为True。
无论如何(回到问题):所有表达式都是从左到右评估的,如果上面的规则允许,则不会触及其他表达式。
Python 的or运算符短路,它将从左到右进行评估:
if (foo > 5) or (bar > 6):
print 'foobar'
如果foo > 5, 那么bar > 6甚至不会被测试,True or <anything>就像True. 如果foo不是> 5,bar > 6则将进行测试。
运算符从左到右求值。但仅当所有运算符的优先级相同时。当运算符的优先级不相等时,运算符将根据优先级执行。
前任。
假或假或真假假
真或假和真或假真
假或假和真或假假
即首先在表达式中执行具有最高优先级的运算符,然后进一步执行。