抛砖引玉
之前在布尔类型的文章中,我留下了一个问题,现在是时候解答了。
#测试一
>>> 2 and 4
4
>>> 3 or 5
3
>>> "python" and "C"
'C'
>>> "Hello" or 123
'Hello'
结果为什么是这样子的呢?在解答之前,我们先看一下下面这段代码:
#测试二
>>> (not 3) or (0 and 5) or (4 and 7) or (2 and 6) or (8 and 9)
7
大家知道答案为什么是7
吗?这是因为and
,or
这两个逻辑运算符遵循短路逻辑,那么什么是短路逻辑呢?肯定不会是大脑短路的短路啊。
短路逻辑
所谓短路逻辑就是:从左往右,只有当第一个操作数的值无法确定逻辑运算的结果时,才对第二个操作数进行求值。
这样看概念未免有点太抽象了,我们直接对代码进行分析好了,先看测试一的代码:
2 and 4
的值是4
,这是因为and
运算符要求只有两个操作数同时为True
时,结果才能为True
,此时左边2
为True
,但是我们还需要知道右边的值才能判断最后的结果,所以Python直接返回的是右边的值。3 or 5
的值是3
,这是因为or
运算符要求两个操作数只要有一个True
,那么结果就为True
,此时3
为True
,所以Python直接返回第一个操作数的值。- 对于字符串或者其他类型也是一样的道理。
我们可以在举两个例子来看看:
>>> 0 and 5
0
>>> 0 or 3
3
0 and 5
,0
为False
,对于and
,结果肯定为False
,所以直接返回0
。0 or 3
,0
为False
,对于or
,还无法做出最后的判断,结果取决于后面的操作数,所以Python直接返回后面的操作数4
。
揭开面纱
对于Python来说,它根本就没必要将全部的结果都判断完才返回,直接将影响结果的关键值返回出来就好了,这就是短路逻辑。
好了,我们现在回到测试二的代码中:
-
对于有括号的,我们就先计算括号,于是代码变成:
>>> False or 0 or 7 or 6 or 9
-
按照短路逻辑进行运算(从左往右),由于这里剩下的逻辑运算符都是or,根据我们前面分析的,只需要找到一个为
True
的值就好了,后面的就不用管了,于是结果就为7
。
运算符优先级
还是通过一个问题来介绍这个概念,我们将测试二的程序改一下,将括号都去掉,你能猜到结果是什么吗?
#测试三
>>> not 3 or 0 and 5 or 4 and 7 or 2 and 6 or 8 and 9
答案还是7
,你算对了吗?不对不要紧,马上你就会知道为什么了。
小学学数学的时候我们就已经了解到了优先级的概念,比如先乘除后加减,Python也不例外,关于Python的优先级,我也有专门整理了表格,点我传送,此外对于逻辑运算符,本身也是有优先级区分的,由高至低依次是:
not > and > or 由高至低
举例,计算0 or 3 and not 6
- 根据优先级
not
最高,于是变成0 or 3 and False
。 - 其次
and
,于是变成0 or False
。 - 最后
or
,于是结果False
。
回到测试三的代码中:
-
变成
False or 0 and 5 or 4 and 7 or 2 and 6 or 8 and 9
- 变成
False or 0 or 7 or 6 or 9
- 最后结果
7
。
- 变成
最后
好了,以上就是此次Python学习的小结,如有不对之处欢迎指出,大家一起学习进步。