布尔逻辑表达式
布尔逻辑表达式中,除了评估到 True
或 False
,返回值其解释为 True
或 False
。它是 Pythonic 表示逻辑的方式,否则可能需要 if-else 测试。
和运算符
and
运算符计算所有表达式,如果所有表达式求值为 True
,则返回最后一个表达式。否则返回第一个计算为 False
的值:
>>> 1 and 2
2
>>> 1 and 0
0
>>> 1 and "Hello World"
"Hello World"
>>> "" and "Pancakes"
""
或者运算符
or
运算符从左到右计算表达式,并返回计算为 True
的第一个值或最后一个值(如果没有 True
)。
>>> 1 or 2
1
>>> None or 1
1
>>> 0 or []
[]
懒惰的评价
使用此方法时,请记住评估是懒惰的。不评估不需要评估以确定结果的表达式。例如:
>>> def print_me():
print('I am here!')
>>> 0 and print_me()
0
在上面的例子中,print_me
永远不会执行,因为 Python 在遇到 0
(False
)时可以确定整个表达式是 False
。如果需要执行 print_me
来为你的程序逻辑提供服务,请记住这一点。
测试多种条件
检查多个条件时常见的错误是错误地应用逻辑。
这个例子试图检查两个变量是否都大于 2.语句被评估为 - if (a) and (b > 2)
。这会产生意想不到的结果,因为当 a
不为零时,bool(a)
评估为 True
。
>>> a = 1
>>> b = 6
>>> if a and b > 2:
... print('yes')
... else:
... print('no')
yes
每个变量都需要单独进行比较。
>>> if a > 2 and b > 2:
... print('yes')
... else:
... print('no')
no
当检查变量是否是多个值之一时,会产生另一个类似的错误。此示例中的语句被评估为 - if (a == 3) or (4) or (6)
。这会产生意想不到的结果,因为 bool(4)
和 bool(6)
各自评估为 True
>>> a = 1
>>> if a == 3 or 4 or 6:
... print('yes')
... else:
... print('no')
yes
同样,每次比较必须单独进行
>>> if a == 3 or a == 4 or a == 6:
... print('yes')
... else:
... print('no')
no
使用 in 运算符是编写此函数的规范方法。
>>> if a in (3, 4, 6):
... print('yes')
... else:
... print('no')
no