
3.2 逻辑运算
在代码清单3-3的if...elif...else...语句中,逻辑运算(判定条件)如下:

这里的“==”用于比较两个值是否相同,是一个逻辑条件,它将返回布尔值,如果为True则执行对应的分支,如果为False则继续判断下一个条件。严格来说,在Python中判定条件不一定需要使用布尔值,也可以使用其他的数据类型,包括数字类型、字符串类型、空(None)和后续介绍的复杂类型等,代码清单3-5就是这样的。
代码清单3-5:各种类型的判定条件


运行上述代码得到的输出结果如下:

显然,对于数字0、""、False和None(对象为空),在Python中都会在条件判断内认为是假,也就不再执行对应分支的代码块逻辑。
注意 对于条件判断应该尽可能使用布尔值
对于条件判断,虽然在Python中可以使用非布尔值,但在实际应用中应该尽可能使用布尔值。这是因为布尔值具备逻辑学的真假的判定,更具备可读性和逻辑性,因此,在控制条件中使用布尔值具备更高的可读性。如果使用非布尔值,那么代码的可读性会降低。基于这个原因,本书后续在判定条件中只使用布尔值。
C/C++中的判定条件和Python中的判定条件是接近的,而Java中的判定条件只能是布尔值。
3.2.1 逻辑运算符
Python也支持逻辑运算,逻辑运算符比较简单,如表3-1所示。
表3-1 逻辑运算符

下面通过举例来说明表3-1中的内容,如代码清单3-6所示。
代码清单3-6:逻辑运算

上述代码做了详细的解释,再结合表3-1中的说明,相信读者能理解最终返回的值。
但是严格来说,字符串、数字等参与运算会降低代码的可读性,甚至会造成很多误解,从而容易出错,所以笔者并不建议像例子中那样使用非布尔值进行逻辑运算,而应该使用布尔值进行逻辑运算,如下所示:


显然,这样使用判定条件会具有更明确的逻辑含义,因此本书尽量采用布尔值作为判定条件,而不会使用其他类型的值作为判定条件。
说明 对于一些特别简单的判断也可以不使用布尔值
有时也可以不使用布尔值作为判定条件,如下所示:

当判定条件简单且不容易造成歧义时,也可以不使用布尔值作为判定条件。
3.2.2 逻辑运算符的优先级
逻辑运算符是存在优先级的,默认情况下的优先级是not>and>or,如代码清单3-7所示。
代码清单3-7:逻辑运算符的优先级

需要注意代码中的3个逻辑运算式,笔者在注释中清楚地标明了它们的优先级。此外,还需要注意①处的代码,在需要改变逻辑运算符的优先级顺序时,可以使用圆括号来处理。
注意 对于一些复杂的逻辑表达式,应该适当地加入圆括号,以提高代码的可读性。
有时有些逻辑表达式会比较复杂,如下所示:

需要注意加粗的代码,①式和②式表达的含义是相同的,只是②式的写法更好,因为圆括号将原有的顺序表达得更清晰,使开发者阅读时不容易犯顺序错误。因此,适当地加入圆括号有利于代码可读性的提高。
3.2.3 改写闰年判断逻辑
代码清单3-4中判断闰年的逻辑还是有点冗余的,通过学习逻辑运算,可以将其简化,如代码清单3-8所示。
代码清单3-8:改写闰年判断逻辑

代码①处使用了and逻辑运算符,使判定条件满足不能被100整除但能被4整除,输出该年份为闰年。显然,与代码清单3-4相比,这段代码的可读性更高,逻辑感更强。