
大家好,欢迎来到 Crossin 的编程教室。
Python 的逻辑运算(and、or、not)乍一看并没有特别复杂,但实际上藏了不少“陷阱”。很多初学者写着写着就踩坑了,然后一脸懵:代码明明看起来没问题啊?
今天我们就来盘点 6 个容易让新手掉坑里的逻辑运算实例,看完有没有你踩过的,
1. 运算结果不是 bool 值
print("hello" and "world")
print(0 or 100)有人以为:既然是逻辑运算,那结果应该是 bool 值 True / True
实际运行:world / 100
Python 的 and/or 不是简单返回布尔值,而是返回最后一个“决定命运”的那个值。
and:左边为“真” → 继续看右边,返回右边;左边为“假” → 直接返回左边
or:左边为“真” → 直接返回左边;左边为“假” → 返回右边
这也是为什么很多人用 name = input() or "匿名" 这样的写法来设置默认值。
2. and 和 or 优先级不同
print(2 or 1 and 0)有人以为:2 or 1 → 2,再 2 and 0 → 0,所以 0
实际运行:2
and 的优先级高于 or(跟乘法高于加法一样)。
所以上面等价于:2 or (1 and 0) → 2 or 0 → 2
3. 链式比较的错觉
print(1 < 2 is True)有人以为:True
实际运行:False
Python 的链式比较是 and 的变种写法:
a < b is True 等价于 (a < b) and (b is True)
而 2 is True 是 False(因为 2 不是 True 这个对象),1 < False 为 False。
很多人在写单元测试时踩过这个坑。
4. all([]) 的含义
print(all([]))
print(any([]))有人以为:False / False
实际运行:True / False
all():没有遇到 False,就认为是 True(一个假的都没有为 True)
any():没有遇到 True,就认为是 False(一个真的都没有为 False)
数学上来说:空集上的全称量词为真。
在编程中,检查列表里是否“全部满足条件”时,空列表惯例被认定为通过。
5. 短路求值跳过代码
def check():
print("我在执行!")
return True
print(False and check())有人以为:输出“我在执行!”
实际运行:只输出了 False
and/or 是短路求值的:
and 左边为假 → 右边不执行
or 左边为真 → 右边不执行
这是一种性能优化。其经典用法比如:
user and user.send_email() # user为空就不调用,不会报错6. True 和 False 当数字用
print(True + 5)
scores = [True, False, True]
print(sum(scores))有人以为:Error!bool 和 int 相加,类型不匹配
实际运行:6 / 2
在 Python 里,True 和 False 是 int 的子类:
True == 1、False == 0 都成立,而且可以直接参与 + - * / 等运算。
所以要统计列表中有多少个值大于60,就可以这么写:
count = sum(x > 60 for x in lst)总结
上面列出的这些,都是 Python 逻辑运算时非常常见的问题,想必你在写代码的过程中一定遇到过。
踩坑不要紧,但要理解为什么会踩,知其然更知其所以然,下次就不会再出现同样的错误,代码能力也就随之提高了。
否则,只关注程序的结果,代码跑通就万事大吉,而忽略其中的逻辑,那不管是自己写的代码,还是AI生成的代码,都可能暗藏了未知的隐患。
你还遇到过什么反直觉的程序结果?欢迎在留言区分享。
如果本文对你有帮助,欢迎点赞、评论、转发。你们的支持是我更新的动力~
感谢转发和点赞的各位~
本文分享自 Crossin的编程教室 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!