![Python程序设计:人工智能案例实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/423/39980423/b_39980423.jpg)
3.13 布尔运算符and
、or
和not
条件运算符>
、<
、>=
、<=
、==
和!=
可用于组成简单条件,例如grade>=60
。要将简单条件进行组合,构成更复杂的条件,可以使用布尔运算符and
、or
和not
。
布尔运算符and
要在执行控制语句的套件之前确保两个条件都为True
,可以使用布尔运算符and
来组合条件。下面的代码定义了两个变量,当且仅当两个简单条件都为True
时,测试条件为True
,如果两个简单条件中的任何一个(或两个)为False
,则整个and
表达式的值为False
:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/082-1.jpg?sign=1739280703-UPpnD28xRizRfBXa4yGl7RAOgmTt9Dpi-0-0da7868ea2494c6bd784808df34a74c9)
if
语句包含以下两个简单条件:
gender == 'Female'
决定一个人是否是女性;age >= 65
决定一个人是否是老年人。
首先评估and
运算符左侧的简单条件,因为==
的优先级高于and
。如有必要,接下来评估and
右侧的简单条件,因为>=
也具有比and
更高的优先级。(后面会简要讨论为什么只有当左侧条件为True
时,才会评估and
运算符右侧的条件。)当且仅当两个简单条件都为True
时,整个if
语句的条件为True
。通过添加冗余括号可以使组合条件更清晰,如下:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/082-2.jpg?sign=1739280703-MBDD6fLg8oQqSKMdrbuTRMMkXxL2mxT3-0-c45378968b97be0411d6849882546232)
下表称为真值表,通过显示表达式1和表达式2的值为False
和True
的所有四种可能组合来总结运算符and
的运算规则。
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/082-3.jpg?sign=1739280703-RwPqwlMhMNAP29MA6CIdPUWEFGRp6IH8-0-e06289666e835deec7e2a785d4ac0413)
布尔运算符or
布尔运算符or
可以测试两个条件中的一个或两个是否为True
。在下面的代码中,如果其中一个或两个简单条件为True
时,整个测试条件为True
,当且仅当两个简单条件均为False
时,整个测试条件为False
:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/082-4.jpg?sign=1739280703-2i8wgB3KUCwuG41uGH6IcMR87FAqKwCf-0-3e10603ef8f7a4f359080a77b4b1e154)
代码段[6]
同样包含两个简单的条件:
semester_average >= 90
确定学生在学期内的平均成绩是否为A
(90或以上);final_exam>=90
确定学生的期末考试成绩是否为A
。
运算符and
的优先级高于or
。下面的真值表总结了布尔运算符or
的运算规则。
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/083-1.jpg?sign=1739280703-5bcUWkKcklJAshIyy6k4SgNNdRKHMlh3-0-761ca1f05580499311a37c2eb2547fc9)
利用短路提高性能
一旦知道整个条件是否为False
,Python就会停止计算and
表达式。类似地,一旦知道整个条件是否为True
,Python就会停止计算or
表达式。这种机制称为短路。因此在条件
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/083-2.jpg?sign=1739280703-u5960a8oD7l0AV8y9TLcR24Dj81zlYfV-0-567ab55438ee361e5e1fc7435351a7e8)
中,如果gender
不等于'Female'
,立即停止计算,因为整个表达式的值一定为False
;否则继续执行,如果age
大于或等于65
,整个表达式的值为True
。
同样,在条件
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/083-3.jpg?sign=1739280703-oss3vuEzvoXSB4UQn5k7za5482EAfk40-0-7c6dbe8163e454608e79efcb4bacf4ab)
中,如果semester_average
大于或等于90
,立即停止计算,因为整个表达式的值一定为True
;否则继续执行,因为如果final_exam
大于或等于90
,整个表达式的值仍然可以是True
。
在使用and
表示条件时,应该将其值更有可能为False
的条件放在最左边。同样,在使用运算符or
的表达式中,应该将其值更有可能为True
的条件放在最左边。这些技巧可以减少程序的执行时间。
布尔运算符not
布尔运算符not
表示“取反”,即True
变为False
,False
变为True
。not
只有一个操作数,是一元运算符。如果原始条件(没有not
运算符)为False
,可以在条件之前放置not
运算符来选择执行该路径,例如:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/083-4.jpg?sign=1739280703-QMqu46GWKIHZNgVm1ntGiDUa5yElxIK8-0-e3d24f1e5ca99f6748d475d5ad0e0f55)
通常,我们会避免使用not
,而是以更“自然”或方便的方式表达条件。例如,上面代码中的if
语句也可以写成如下形式:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/084-1.jpg?sign=1739280703-2kijCV4QDKONcBAtqUkjp2CCSZgqJo6w-0-de13bfd8bd8516fbe3b34044adc129fa)
下表是not
运算符的真值表。
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/084-2.jpg?sign=1739280703-PM53PbBGfcs9FXytFmgJ669FYliY8nWL-0-dc63dd35804fe7c32dc8b1a95e2aeefc)
下表从上到下按优先级的降序显示了运算符的优先级和结合性。
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/084-3.jpg?sign=1739280703-yc3uP6nGzHLNoiJIzLONHvQhYBHIiRxR-0-c5dcaf5b6a26752c57978f4117c6f5f0)