如果您有一个 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
;如果计算结果为True
thenexpression 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
将返回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
则将进行测试。
运算符从左到右求值。但仅当所有运算符的优先级相同时。当运算符的优先级不相等时,运算符将根据优先级执行。
前任。
假或假或真假假
真或假和真或假真
假或假和真或假假
即首先在表达式中执行具有最高优先级的运算符,然后进一步执行。