(第二版)零基础入门Python小甲鱼-笔记-p12

(第二版)零基础入门Python小甲鱼-笔记-p12

短路逻辑和运算符优先级

上节课留的问题大家有解决么?

这次又有新的问题嘞?

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

大家花个30s来思考一下答案是多少嘞

为啥结果是4嘞?

 

这是因为 and 和 or 都是要遵从短路逻辑

那什么是短路逻辑呢

短路逻辑的核心思想:从左往右,只有当第一个操作数的值无法缺点逻辑运算的结果时,才对第二个操作数进行求值.

这说的太官方了,萌新表示很难懂嘞,还是用案例来说明

比如现在我们有一个表达式 3 and 4 对不对 它的结果是?

结果是4

如果是 3 or 4 

结果却右边成了3 

这是我们上一节课留下的问题对不对?

这里我们把刚刚短语逻辑的思想拿回来品味一下

短路逻辑的核心思想:从左往右,只有当第一个操作数的值无法缺点逻辑运算的结果时,才对第二个操作数进行求值.

这里 3 and 4  and运算符的要求是

 左右两边都为True 才会返回True 那么左边3是True没问题

是不是还要继续判断右边的布尔类型值才能够得出最后的结果 对嘛 所以呢

右边的结果是不是直接影响了最后的结果 

Python就把右边的值直接给扔出来就可以了

同样的道理

3 or 4

 第一个值3的真值测试结果是True没问题  由于 or 运算符两边只要有一个是True ,那么结果肯定是True

所以呢 ,直接将第一个操作数扔出来就可以啦 对不对

好,那我们再举两个例子

0 and 3

得到多少 ,得到0嘛

3 or 4得到多少

 得到4嘞

因为呢  对于and操作符来说 第一个操作数是0 ,那么0的真值测试结果是False 直接就可以出局了对不对 结果肯定是False 所以后面3 Python 都不会瞅它一眼

对于 or 操作符虽然是 False 但没关系 只要第二个操作数的真值测试是True就可以了 所以呢 第二个操作数就直接影响了最后的结局 因此呢 Python 将第二个操作数直接扔出来

好啦 我们总结一下

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

好 那我们理解一下刚刚复杂的表达式

 首先对于这些复杂的表示 有小括号的我们首先运算小括号里面的内容 这跟小学数学是一样的

所以呢这个式子应该拆成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 

好 那我们接下来讲第二个内容

运算符 优先级 那么再考考大家  还是拿这个表达式来搞搞你

这次我们将小括号去掉 变成(如下)

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

会是多少呢 还是给大家30s的时间思考 告诉我多少嘞

好啦 我知道大多数的童鞋的答案是3 对不对?

我们看看Python 是怎么想的 

跟4过不去嘞 回答3的童鞋也不要自责  因为呢,你萌还没学到 Python的运算优先级嘛

Python的运算符优先级 讲的是 运算表达式时 执行的先后顺序 先执行具有较高优先级的运算符

然后呢 在执行较低优先级的运算符  比如说 小学生都知道的先乘除后加减 这就是优先级

那么在这个表格里面呢 就从低到高列出Python的运算符优先级 

优先级运算符描述
1lambdaLambda 表达式
2if - else条件表达式
3or布尔“或”
4and布尔“与”
5not x布尔“非”
6in , not in , is , is not , < , <= , > , >= , != , ==成员测试,同一性测试,比较
7|按位或
8^按位异或
9&按位与
10<< , >>移位
11+ , -加法,减法
12* , @ , / , // , %乘法,矩阵乘法,除法,地板除,取余数
13+x , -x ,  ~x正号,负号 ,按位翻转
14**指数
15await xAwait表达式
16x[index] , x[index:index] , x(argjmets....),x.attnibute下标,切片,函数调用,属性引用
17(expressions...),[expressions..],{key :value ...}, {expressions...}绑定或元组显示,列表显示,字典显示,集合显示

注意哟  优先级1是要比2要小的哈  从低到高 上面是低的 下面是高的 如果你现在已经工作了那么开发程序的时候记不清优先级拿问题不大  想哪个先搞咱加个小括号就行了对不对

但是 如果你不幸还在读书 那就一定要记清楚咯 因为呢 这绝对是一个考点 为什么呢 这么多运算符我就不相信你萌能够把它们全部背下来 对不对 所以大家发现了没有 当你在学习的时候要有逆向思维 如果你是老师 你会怎么出题对不对 所以当你发现一个东西 一个知识点 特别复杂 特别容易混淆 那么它必定就是一个考点 这时候你只需要花十几分钟的时间 把它们硬核地记下来

得了 状元就是你咯

那这里面呢有很多陌生得面孔 没关系哈 大家只要坚持学下去 迟早会认识它们得 不过呢

当下我们就挑挑认识得来讲讲嘞

首先呢 乘法 除法 求余  这个地板除得优先级 要高于加法 和减法 毋庸置疑

 然后呢它们得优先级都要高于 这个比较运算符

 所以呢 我们会发现

1 + 2 > 3  - 4 它得结果是True  因为它会优先计算 1 + 2  然后呢再计算 3 - 4  再把它们两个得到得值进行一个比较 得到得结果是 True

 但是比较 运算符得优先级又要比and or 和not 要高

 所以呢 我们如果出现 not 1 < 2 它会先将 1 < 2 这个比较运算符先运算  得到得是一个True对吧 

not True 得到得就是False

然而 and or 和 not 三个运算符得优先级又不一样了

其中呢 not 优先级是最高的 然后是 and 最后才是 or

 所以 我们可以举列子

0 or 1 and not 2

得到的值是什么呢  得到的是False

 因为呢 Python 会优先运算 not 2 得到 False 对吧 那就变成

0 or 1 and False  那么接下来 是and运算符 那么它就会运算1 and False 的结果肯定就是什么啦

是False嘛 那么 0 or False 两边都是False 那么得到的结果自然 也是False 

好的 这就是这节课的所有内容了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值