网站首页 > 技术文章 正文
上一篇文章,崔九八给大家扔了一个问题,不知道大家得出答案了没有?
短路逻辑
这次又搞出了一个新的问题,大家用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
猜你喜欢
- 2025-01-18 Python机器学习库Sklearn系列教程(14)-逻辑回归
- 2025-01-18 Google裁撤Python团队的背后逻辑
- 2025-01-18 快乐8预测遗传算法的实现逻辑
- 2025-01-18 Python电子发票管理工具4:前后端业务逻辑实现
- 2025-01-18 【Python特征工程系列】SHAP特征重要性分析-逻辑回归模型为例
- 2025-01-18 python 简单几句搞定逻辑回归AI算法
- 2025-01-18 一文带您了解逻辑回归(Logistic Regression): Python示例
- 2025-01-18 膜拜!终于有人能把人工智能算法的“逻辑回归”讲得明明白白了
- 2025-01-18 Python类与对象:构建复杂逻辑的魔法
- 2025-01-18 Python 比较难的问题,逻辑结构和代码
- 258℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 83℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)