程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

Python之短路逻辑和运算符优先级

hfteth 2025-01-18 20:04:01 技术文章 13 ℃

上一篇文章,崔九八给大家扔了一个问题,不知道大家得出答案了没有?

短路逻辑

这次又搞出了一个新的问题,大家用30秒钟思考一下,问题如下:

为什么这个表达式的是结果是这样的?为什么答案是4?

((not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)) == 4

这是因为and和or这两个运算符都是要遵从短路逻辑的。什么是短路逻辑呢?短路逻辑的核心思想:从左往右,只有当第一个操作数的值无法确定逻辑运算的结果时,才对第二个操作数进行求值。

这么官方的回答,相信很多人都无法理解这到底说的神马???

举个例子说一下到底什么意思,代码如下:

  • 3 and 4:and运算符的要求是左右两个操作数的真值测试结果只有同时为True,结果才能为True,这时我们看短路逻辑的核心思想,左边3是True没问题,要继续判断右边的布尔类型值才能够得出最后的结果,所以右边的结果直接影响了最后的结果,python就把右边的值直接扔出来就可以了,结果就为4
  • 3 or 4:第一个值3的真值测试结果是True,or运算符的要求是两边只要有一个是True,那么结果肯定是True,所以Python直接将第一个操作数扔出来就可以啦,结果就为3

再举一个例子,代码如下:

  • 0 and 3:对于and运算符来说,第一个操作数是0,那么0的真值测试结果是False,直接就可以出局了,结果肯定为False,所以后面的3,python都不会瞅它一眼
  • 0 or 4:对于or运算符来说,第一个操作数虽然是False,但没关系,只要第二个操作数的真值测试是True就可以了,所以第二个操作数就直接影响了最后的结局,因此python将第二个操作数直接扔了出来,结果就为4

总结:从Python的角度来看,它根本没有必要将最终的结果判断完再汇报,更高效率的方法是直接把影响结果的关键值给扔出来就可以了,这就是所谓的短路逻辑

接下来解释一下这个复杂的表达式:

((not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)) == 4

首先,对于这种复杂表达式,有小括号的我们先运算小括号里面的内容,所以这个式子可以拆分成5个部分进行运算,其中not 1的结果是False,0 and 1的结果是0,3 and 4的结果是4,5 and 6的结果是6,7 and 8 and 9的结果是9,表达式的结果变成了这样,如下:

False or 0 or 4 or 6 or 9

按照前面的观点,or运算符只要左边的操作数为True,那么右边根本不用管它,从左往右看,False or 0的结果是0,0 or 4的结果是4,那4 or 6 or 9就不用往下看了,直接把第一个发现是True的操作数给扔出来就可以了,结果就为4

运算符优先级

把上面的复杂表达式换一种方式来考考你们,把小括号全部去掉,结果是什么呢?

结果还是4,这又是为神马???这里应该知道python的运算符优先级

Python的运算符优先级讲得是运算表达式时,执行的先后顺序,先执行具有较高优先级的运算符,然后,再执行较低优先级的运算符,比如小学生都知道的先乘除后加减,这就是优先级。

从低到高列出的Python的运算符优先级: 注意优先级1是要比2要小

如果你现在已经工作了在开发程序的时候记不清除优先级问题不大,想哪个先搞就加个小括号就行了,但是如果你还在读书,那就一定要记清楚哦!因为这绝对是一个考点! 这么多运算符我就不相信你都能背下来,所以当你在学习的时候你一定要有逆向思维,如果你是老师,你会怎么出题!所以当你发现一个东西一个知识点,特别复杂特别容易混淆,那么它必定就是一个考点。

我们挑认识的运算符来讲吧!

首先,乘法、除法、求余,这个地板除的优先级要高于加法和减法的,它们的优先级都要高于这个比较运算符

可以看到:1 + 2 > 3 -4的结果为True,因为它会优先计算1+2,然后再计算3-4,再把它们两个得到的值进行一个比较,得到的结果是True。但是比较运算符的优先级又要比and or 和 not要高!

它会先将1 < 2这个比较运算符先运算,会得到的是一个True

and or 和 not三个运算符的优先级又不一样了,其中not优先级是最高的,然后是and,最后才是or。

Python会先运算not 2得到False,那就变成了如下:

Python先运算and运算符1 and False,结果肯定就是False,0 or False,两边都是False,最终结果就为False。

文章灵感来源:https://www.bilibili.com/video/BV1c4411e77t/?p=12&spm_id_from=pageDriver&vd_source=ab33ce08435d295fd9ff199740f46a0e

Tags:

最近发表
标签列表