![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=1739901450-DS7pVqcIGZdFst7W00E6ww7ckkONKYOz-0-f7af0b7bfcff46d225a622d178fc382f)
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=1739901450-f6lFbkMdtJJ5EpWjmXMfyOkBO5tFKgBi-0-f9755fa80910ea527e6665fe6674b82b)
下表称为真值表,通过显示表达式1和表达式2的值为False
和True
的所有四种可能组合来总结运算符and
的运算规则。
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/082-3.jpg?sign=1739901450-1T99SHmXictK2WDXwym5fnMnlyyTWzZ0-0-3dba220c514726f582ad03a7c2890a19)
布尔运算符or
布尔运算符or
可以测试两个条件中的一个或两个是否为True
。在下面的代码中,如果其中一个或两个简单条件为True
时,整个测试条件为True
,当且仅当两个简单条件均为False
时,整个测试条件为False
:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/082-4.jpg?sign=1739901450-TLa3eJtgRs48OwT8UD62japGh7fRNQqr-0-e496cf6301ba7a2caef2f2fd06d8a55f)
代码段[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=1739901450-zcSGFsRAzRVqty879ZQGvWrGUNVj4pdt-0-ae1ee30429e0fb85aa2051aaef4493bc)
利用短路提高性能
一旦知道整个条件是否为False
,Python就会停止计算and
表达式。类似地,一旦知道整个条件是否为True
,Python就会停止计算or
表达式。这种机制称为短路。因此在条件
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/083-2.jpg?sign=1739901450-47dBoMQoNyAYBPHe8HASHcjf5CXgqVHs-0-fb361086b5188453823244787f5c071f)
中,如果gender
不等于'Female'
,立即停止计算,因为整个表达式的值一定为False
;否则继续执行,如果age
大于或等于65
,整个表达式的值为True
。
同样,在条件
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/083-3.jpg?sign=1739901450-uE6MzZ3JR0lvWPzYt8j3gTUyROiwmJah-0-70d30e9cb2d10e869da1729037e6b2a8)
中,如果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=1739901450-QiZsUHwf5MsH8Nl4fdmLW4b7plZyfDoi-0-4b12d866bbf2891ffc3202bb2579f2bb)
通常,我们会避免使用not
,而是以更“自然”或方便的方式表达条件。例如,上面代码中的if
语句也可以写成如下形式:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/084-1.jpg?sign=1739901450-VPrSkoNd8e7kdJZM25lKhF0Ugdab4buH-0-4265a2419382be93f2108caf125b4517)
下表是not
运算符的真值表。
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/084-2.jpg?sign=1739901450-DgLZXdm9Li4q9K4s2PouhjlwOoPIYqJF-0-dfad267a1a23ce1e03d2cfbb1f36977c)
下表从上到下按优先级的降序显示了运算符的优先级和结合性。
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/084-3.jpg?sign=1739901450-vOQGVqjsVYigUYuX7ah8Rxj9rGgGGhNX-0-d5515d6f34ce135ef7ea49791557905d)