2.4.4 “与”和“或”的短路

逻辑运算符组成的表达式就叫作逻辑表达式。逻辑表达式可以是连续的逻辑运算,运算顺序是从左到右进行的,比如:


>>> True and True or not False and 1+3
True

我们来分析一下计算的过程,如图2-4所示:从左到右,第一层级首先计算True and True、not False和1 + 3,结果分别是True、True和4;然后第二层级计算True or True,得到True;最后计算第三层级True and 4,结果是True。

图2-4 逻辑运算的顺序

克里克里想了一会儿,说:“看起来not运算和算术运算的优先级比and和or高一点啊!”

“不错哦!你知道的还不少。”西西船长表扬克里克里,然后又说,“那你知不知道not运算和or运算还具有短路特性呢?”

“短路特性?”克里克里不解地问,“就像电路里的短路一样吗?”他脑海里出现了如图2-5所示的场景。

图2-5 当发生短路现象时电流不流经灯泡

“有些类似!请听我说。”西西船长回答克里克里,“在没有括号参与时,逻辑表达式从左到右,依次运算,当遇到第一个能决定结果的逻辑值后,就废弃后面的所有运算。”

1)对于and运算,只要参与and运算的对象中有一个代表False,那么不管其他对象是什么,结果都会是False。所以只要从左到右计算得到第一个False,后面的都不会再计算了。她写了一段代码作为证据:


>>> 99 and -4 and 'a' and True and 2+3
5
>>> 99 and -4 and 'a' and False and 2+3
False

第一行代码直到最后都没有出现False,所以得到结果为最后一项的计算值5;第二行代码遇到False即得到结果False,后续的2 + 3不再执行,被“短路”了。

2)对于or运算,只要参与or运算的对象中有一个代表True,那么不管其他对象是什么,结果都会是True。所以只要从左到右计算得到第一个True,后面的都不会再计算了。她同样写了一段代码作为证据:


>>> 0 or False or 5-5 or '99'
'99'
>>> 0 or False or '99' or 99
'99'

第一行代码直到最后才出现字符串“99”,它代表True,所以得到结果为最后一项的计算值“99”;第二行代码遇到字符串“99”,它代表逻辑True,所以得到结果“99”,后续的整数99不再考虑,被“短路”了。

3)not运算只有两个符号(如not True),被称为两目运算,不存在短路问题。

【练一练】

请写出1 and 2 or 3 and 4 or not 5 and 6 + 7 or 8 and not 0的结果,并描述计算的顺序。