![Python+Excel办公自动化一本通](https://wfqqreader-1252317822.image.myqcloud.com/cover/221/40795221/b_40795221.jpg)
3.2 逻辑运算
在代码清单3-3的if...elif...else...语句中,逻辑运算(判定条件)如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/067-2.jpg?sign=1738792487-nmWuJXcSI0DTdgb9uY1sYJhpSQQwotsP-0-a779f33397f1443680b36ac3e9c893ba)
这里的“==”用于比较两个值是否相同,是一个逻辑条件,它将返回布尔值,如果为True则执行对应的分支,如果为False则继续判断下一个条件。严格来说,在Python中判定条件不一定需要使用布尔值,也可以使用其他的数据类型,包括数字类型、字符串类型、空(None)和后续介绍的复杂类型等,代码清单3-5就是这样的。
代码清单3-5:各种类型的判定条件
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/067-3.jpg?sign=1738792487-gKBmJjlHjYUMvX5UdPuun8VLb3aQ2C6z-0-9a8e9b13df843eca68bde627b0d6da8b)
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/068-1.jpg?sign=1738792487-BgdAMVGgiJsAryFLStJ1mMaF3LTV8UOx-0-3731ea9ad77d1a835ff25de677c923c0)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/068-2.jpg?sign=1738792487-e3A0SecX9jAoqf6p4X2ud1ILMGwI4bVs-0-f271dd690b20bb911f15ea92a5aa39fc)
显然,对于数字0、""、False和None(对象为空),在Python中都会在条件判断内认为是假,也就不再执行对应分支的代码块逻辑。
注意 对于条件判断应该尽可能使用布尔值
对于条件判断,虽然在Python中可以使用非布尔值,但在实际应用中应该尽可能使用布尔值。这是因为布尔值具备逻辑学的真假的判定,更具备可读性和逻辑性,因此,在控制条件中使用布尔值具备更高的可读性。如果使用非布尔值,那么代码的可读性会降低。基于这个原因,本书后续在判定条件中只使用布尔值。
C/C++中的判定条件和Python中的判定条件是接近的,而Java中的判定条件只能是布尔值。
3.2.1 逻辑运算符
Python也支持逻辑运算,逻辑运算符比较简单,如表3-1所示。
表3-1 逻辑运算符
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/068-3.jpg?sign=1738792487-jC3egGSsuNz3awXLCozXwbXTp0j5MTR5-0-a813b4bee2151aba47dead64a39484c8)
下面通过举例来说明表3-1中的内容,如代码清单3-6所示。
代码清单3-6:逻辑运算
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/069-1.jpg?sign=1738792487-kYwpzRbyutyumL1IismkcJgeB97mwjkU-0-f7bb08fe1e9f8752f62e95e5eb54b3ed)
上述代码做了详细的解释,再结合表3-1中的说明,相信读者能理解最终返回的值。
但是严格来说,字符串、数字等参与运算会降低代码的可读性,甚至会造成很多误解,从而容易出错,所以笔者并不建议像例子中那样使用非布尔值进行逻辑运算,而应该使用布尔值进行逻辑运算,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/069-2.jpg?sign=1738792487-6TyXyHvDahdAFOkYRlKxqyCVtJukaf0R-0-7264d0ce6e17a2b3641a0bee305e901e)
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/070-1.jpg?sign=1738792487-ZE1kR4wEzwexFe2QG84lAG6uhwgy3dkW-0-3edfa3c34d1d9c1409d07304b98edd35)
显然,这样使用判定条件会具有更明确的逻辑含义,因此本书尽量采用布尔值作为判定条件,而不会使用其他类型的值作为判定条件。
说明 对于一些特别简单的判断也可以不使用布尔值
有时也可以不使用布尔值作为判定条件,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/070-2.jpg?sign=1738792487-YNsZs3C5wqqUncH4ttra30nVItAvJS0b-0-9b215082c4d07abfdbbf425cd0add5e8)
当判定条件简单且不容易造成歧义时,也可以不使用布尔值作为判定条件。
3.2.2 逻辑运算符的优先级
逻辑运算符是存在优先级的,默认情况下的优先级是not>and>or,如代码清单3-7所示。
代码清单3-7:逻辑运算符的优先级
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/070-3.jpg?sign=1738792487-FxZcvDq0CgnnRVk3xTtuDRqfnPKClv3h-0-0ec28eec6daeb2b10e1b63d4cb741c3a)
需要注意代码中的3个逻辑运算式,笔者在注释中清楚地标明了它们的优先级。此外,还需要注意①处的代码,在需要改变逻辑运算符的优先级顺序时,可以使用圆括号来处理。
注意 对于一些复杂的逻辑表达式,应该适当地加入圆括号,以提高代码的可读性。
有时有些逻辑表达式会比较复杂,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/071-1.jpg?sign=1738792487-vTz9qrfyPrqALaMOuPvZ4oMuL3wDPKh5-0-2573ad16dc0fbd349db7aa26eab7f815)
需要注意加粗的代码,①式和②式表达的含义是相同的,只是②式的写法更好,因为圆括号将原有的顺序表达得更清晰,使开发者阅读时不容易犯顺序错误。因此,适当地加入圆括号有利于代码可读性的提高。
3.2.3 改写闰年判断逻辑
代码清单3-4中判断闰年的逻辑还是有点冗余的,通过学习逻辑运算,可以将其简化,如代码清单3-8所示。
代码清单3-8:改写闰年判断逻辑
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/071-2.jpg?sign=1738792487-7VaKxnMzY8TqFORP1mYNY20x9GOO7vX5-0-f6c423eeb56f04f5096817b412b7f3d1)
代码①处使用了and逻辑运算符,使判定条件满足不能被100整除但能被4整除,输出该年份为闰年。显然,与代码清单3-4相比,这段代码的可读性更高,逻辑感更强。