and 和or 运算符不只是简单地对其操作数执行布尔运算,给出布尔结果。他们给出的结果是总是他们的操作数之一。这些运算符从左到右求值,and 的优先级高于or,它们短路,这意味着它们会尽快停止求值。
在纯布尔逻辑中,False and x 是 False,无论 x 是什么,因此无需检查 x。 Python 表达式False and x 将给出False 的结果,它不会尝试评估x。因此False and some_function() 将不会调用some_function()。
同样,纯布尔逻辑中的True and x 与x 具有相同的真值,即如果x 为True,则True and x 为True,否则为False。
但是 Python and 运算符可以处理任意操作数。
在a and b 中,如果a 是假的,则不会评估b,结果将为a。如果a 是真的,那么b 将 被评估并成为结果。
这是一个使用 Python 2 的简短演示:
print False and 'boolean'
print 0 and 'integer'
print '' and 'string'
print [] and 'list'
print
print True and 'boolean'
print 7 and 'integer'
print 'a' and 'string'
print [42] and 'list'
print
print True and False
print True and 0
print True and ''
print True and []
print
输出
False
0
[]
boolean
integer
string
list
False
0
[]
(0 和 [] 之间的空行是打印空字符串的位置)。
or 运算符也有类似的考虑。
在纯布尔逻辑中,True or x 是True,不管x 是什么,如果or 表达式的第一部分是True-ish,我们不需要评估第二部分。而False or x 的真值为x。
print False or 'boolean'
print 0 or 'integer'
print '' or 'string'
print [] or 'list'
print
print True or 'boolean'
print 7 or 'integer'
print 'a' or 'string'
print [42] or 'list'
print
print False or False
print False or 0
print False or ''
print False or []
print
输出
boolean
integer
string
list
True
7
a
[42]
False
0
[]
正如我之前所说,这些运算符是从左到右计算的,如果需要,我们可以将它们链接起来。以下是“经典”案例:
print True and 'yes' or 'no'
print False and 'yes' or 'no'
这些语句等价于
print (True and 'yes') or 'no'
print (False and 'yes') or 'no'
输出
yes
no
这种结构在 Python 的早期版本中很常见。这些天来,看到 if 表达式的情况要普遍得多:
print 'yes' if True else 'no'
print 'yes' if False else 'no'
这通常被认为比使用and 和or 的三元表达式更具可读性。此外,如果b 是假的,a and b or c不等同于b if a else c。
但是,了解这个三元 and ... or 的工作原理仍然很重要,尤其是在您需要阅读或维护旧代码时。一些老的 Pythonistas 仍然更喜欢 and ... or 形式,因为它稍微短一些,即使当你不理解它是如何工作的时候它有点令人困惑。 :)