Python的短路逻辑

抛砖引玉

之前在布尔类型的文章中,我留下了一个问题,现在是时候解答了。

#测试一
>>> 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吗?这是因为andor这两个逻辑运算符遵循短路逻辑,那么什么是短路逻辑呢?肯定不会是大脑短路的短路啊。

短路逻辑

所谓短路逻辑就是:从左往右,只有当第一个操作数的值无法确定逻辑运算的结果时,才对第二个操作数进行求值。

这样看概念未免有点太抽象了,我们直接对代码进行分析好了,先看测试一的代码:

  1. 2 and 4的值是4,这是因为and运算符要求只有两个操作数同时为True时,结果才能为True,此时左边2True,但是我们还需要知道右边的值才能判断最后的结果,所以Python直接返回的是右边的值。
  2. 3 or 5的值是3,这是因为or运算符要求两个操作数只要有一个True,那么结果就为True,此时3True,所以Python直接返回第一个操作数的值。
  3. 对于字符串或者其他类型也是一样的道理。

我们可以在举两个例子来看看:

>>> 0 and 5
0
>>> 0 or 3
3
  1. 0 and 50False,对于and,结果肯定为False,所以直接返回0
  2. 0 or 30False,对于or,还无法做出最后的判断,结果取决于后面的操作数,所以Python直接返回后面的操作数4
揭开面纱

对于Python来说,它根本就没必要将全部的结果都判断完才返回,直接将影响结果的关键值返回出来就好了,这就是短路逻辑。

好了,我们现在回到测试二的代码中:

  1. 对于有括号的,我们就先计算括号,于是代码变成:

    >>> False or 0 or 7 or 6 or 9
    
  2. 按照短路逻辑进行运算(从左往右),由于这里剩下的逻辑运算符都是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

  1. 根据优先级not最高,于是变成0 or 3 and False
  2. 其次and,于是变成0 or False
  3. 最后or,于是结果False

回到测试三的代码中:

  1. 变成False or 0 and 5 or 4 and 7 or 2 and 6 or 8 and 9

    1. 变成False or 0 or 7 or 6 or 9
    2. 最后结果7

最后

好了,以上就是此次Python学习的小结,如有不对之处欢迎指出,大家一起学习进步。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值