Python精讲 | 逻辑运算中的短路求值

入门教程、案例源码、学习资料、读者群

请访问: python666.cn

大家好,欢迎来到 Crossin的编程教室 !

之前我们讲过 逻辑运算的规律。观察一下真值表,

a8a693b12e9b4db3b95e6d505f076448.png

你会进一步发现这样两条规律:

  • 如果一个条件为真,那么它 or 另一个条件无论真假,结果一定为真

  • 如果一个条件为假,那么它 and 另一个条件无论真假,结果一定为假

于是,编程语言在此基础上建立了一种叫做「短路求值」的执行策略,即:

根据已知条件已经可以确定整个逻辑表达式的结果时,就不再计算剩余表达式的值。

Python也是如此。

比如这段代码:

x = 5
y = 10
if x > 0 or y < 15:
    print('条件满足')

程序计算出 x > 0 为True之后,就不会再计算 y < 15的值,因为无论后面是True还是False,都不影响最终的结果。

为了证明这一点,我们把代码改写一下,把后一个表达式变成函数,并在其中加上一句输出以便观察:

x = -5
y = 10


def y小于(n):
    print('y小于n吗?')
    return y < n


if x > 0 or y小于(15):
    print('条件满足')

输出:

条件满足

运行结果中没有输出函数中的print语句,可见函数没有被执行。

而如果把 x 变成 -5,则输出:

y小于n吗?
条件满足

说明函数被执行了。

短路求值的作用显而易见,就是避免执行不必要的代码,提高程序的效率。

我们在写代码的时候,也可以利用这一点简化代码。

比如要判断 b 是否为 a 的整数倍,如果只是这么写:

a = int(input())
b = 9
if b % a == 0:
    print('b是a的整数倍')

那么当a为0时,就会抛出除0错误,因为整数不能除以0或者对0取模:

ZeroDivisionError: integer division or modulo by zero

而避免这种情况,不必多加一层if,只需要把现有条件增加一下,改为:

if a != 0 and b % a == 0:

这样当a为0时,条件直接短路返回False,不会再执行后面的取模运算。

此外,对于非bool值的逻辑运算,短路求值就不仅只是效率上的优化,更是直接决定了运算的结果。

当两个非bool值进行 and 运算时,如果前值转成bool值为False,就会触发 and 短路求值,运算的结果就是前值;

而如果前值转成bool值为True,不会触发短路求值,结果则是后值。

print(0 and 2)
print(3 and 1)

输出:

0
1

or运算也是类似,如果前值转成bool值为True,就会触发 or 短路求值,运算的结果就是前值;

而如果前值转成bool值为False,不会触发短路求值,结果则是后值。

print(2 or 1)
print(0 or 3)

输出:

2
3

短路求值对于多个连续的and或者多个连续的or也一样有效。

多个and的结果,会短路在第一个假值,否则为最后一个值;

多个or的结果,会短路在第一个真值,否则为最后一个值。

print(1 and [] and 0 and 2)
print(0 or 'a' or 3 or [])

输出:

[]
a

最后留一个思考题:

0 and 1 or 2 and 3 or 4 and 5

结果是多少?为什么?

视频版:

作者:Crossin的编程教室


Crossin的第2本书《码上行动:利用Python与ChatGPT高效搞定Excel数据分析》已经上市了。

点此查看上一本《码上行动:零基础学会Python编程》介绍

6a2be4e0d8c97cd9616769225b8eace9.jpeg

本书从 Python 和 Excel 结合使用的角度讲解处理分析数据的思路、方法与实战应用。不论是希望从事数据分析岗位的学习者,还是其他职业的办公人员,都可以通过本书的学习掌握 Python 分析数据的技能。书中创新性地将 ChatGPT 引入到教学当中,用 ChatGPT 答疑并提供实训代码,并介绍了使用 ChatGPT 辅助学习的一些实用技巧,给学习者带来全新的学习方式。

读者朋友们购买后可在后台联系我,加入读者交流群,Crossin会为你开启陪读模式,解答你在阅读本书时的一切疑问。

感谢转发点赞的各位~


_往期文章推荐_

推荐一波Python技术书单

一段奇葩的1024代码


【教程】: python

【答疑】: 666

更多资源点击阅读原文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crossin的编程教室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值