
3.13 布尔运算符and
、or
和not
条件运算符>
、<
、>=
、<=
、==
和!=
可用于组成简单条件,例如grade>=60
。要将简单条件进行组合,构成更复杂的条件,可以使用布尔运算符and
、or
和not
。
布尔运算符and
要在执行控制语句的套件之前确保两个条件都为True
,可以使用布尔运算符and
来组合条件。下面的代码定义了两个变量,当且仅当两个简单条件都为True
时,测试条件为True
,如果两个简单条件中的任何一个(或两个)为False
,则整个and
表达式的值为False
:

if
语句包含以下两个简单条件:
gender == 'Female'
决定一个人是否是女性;age >= 65
决定一个人是否是老年人。
首先评估and
运算符左侧的简单条件,因为==
的优先级高于and
。如有必要,接下来评估and
右侧的简单条件,因为>=
也具有比and
更高的优先级。(后面会简要讨论为什么只有当左侧条件为True
时,才会评估and
运算符右侧的条件。)当且仅当两个简单条件都为True
时,整个if
语句的条件为True
。通过添加冗余括号可以使组合条件更清晰,如下:

下表称为真值表,通过显示表达式1和表达式2的值为False
和True
的所有四种可能组合来总结运算符and
的运算规则。

布尔运算符or
布尔运算符or
可以测试两个条件中的一个或两个是否为True
。在下面的代码中,如果其中一个或两个简单条件为True
时,整个测试条件为True
,当且仅当两个简单条件均为False
时,整个测试条件为False
:

代码段[6]
同样包含两个简单的条件:
semester_average >= 90
确定学生在学期内的平均成绩是否为A
(90或以上);final_exam>=90
确定学生的期末考试成绩是否为A
。
运算符and
的优先级高于or
。下面的真值表总结了布尔运算符or
的运算规则。

利用短路提高性能
一旦知道整个条件是否为False
,Python就会停止计算and
表达式。类似地,一旦知道整个条件是否为True
,Python就会停止计算or
表达式。这种机制称为短路。因此在条件

中,如果gender
不等于'Female'
,立即停止计算,因为整个表达式的值一定为False
;否则继续执行,如果age
大于或等于65
,整个表达式的值为True
。
同样,在条件

中,如果semester_average
大于或等于90
,立即停止计算,因为整个表达式的值一定为True
;否则继续执行,因为如果final_exam
大于或等于90
,整个表达式的值仍然可以是True
。
在使用and
表示条件时,应该将其值更有可能为False
的条件放在最左边。同样,在使用运算符or
的表达式中,应该将其值更有可能为True
的条件放在最左边。这些技巧可以减少程序的执行时间。
布尔运算符not
布尔运算符not
表示“取反”,即True
变为False
,False
变为True
。not
只有一个操作数,是一元运算符。如果原始条件(没有not
运算符)为False
,可以在条件之前放置not
运算符来选择执行该路径,例如:

通常,我们会避免使用not
,而是以更“自然”或方便的方式表达条件。例如,上面代码中的if
语句也可以写成如下形式:

下表是not
运算符的真值表。

下表从上到下按优先级的降序显示了运算符的优先级和结合性。
