
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。
克里克里想了一会儿,说:“看起来not运算和算术运算的优先级比and和or高一点啊!”
“不错哦!你知道的还不少。”西西船长表扬克里克里,然后又说,“那你知不知道not运算和or运算还具有短路特性呢?”
“短路特性?”克里克里不解地问,“就像电路里的短路一样吗?”他脑海里出现了如图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的结果,并描述计算的顺序。