社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python逻辑运算的那些坑,一个都没踩过,说明你代码写得还不够多

Crossin的编程教室 • 2 月前 • 132 次点击  

大家好,欢迎来到 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 Trueprint(False and check())

有人以为:输出“我在执行!

实际运行:只输出了 False

and/or 是短路求值的:

and 左边为假 → 右边不执行

or 左边为真 → 右边不执行

这是一种性能优化。其经典用法比如:

user and user.send_email()  # user为空就不调用,不会报错

6. True 和 False 当数字用

print(True + 5)scores = [TrueFalseTrue]print(sum(scores))

有人以为:Error!bool 和 int 相加,类型不匹配

实际运行:6 / 2

在 Python 里,True 和 False 是 int 的子类:

True == 1False == 0 都成立,而且可以直接参与 + - * / 等运算。

所以要统计列表中有多少个值大于60,就可以这么写:

count = sum(x > 60 for x in lst)

总结

上面列出的这些,都是 Python 逻辑运算时非常常见的问题,想必你在写代码的过程中一定遇到过。

踩坑不要紧,但要理解为什么会踩,知其然更知其所以然,下次就不会再出现同样的错误,代码能力也就随之提高了。

否则,只关注程序的结果,代码跑通就万事大吉,而忽略其中的逻辑,那不管是自己写的代码,还是AI生成的代码,都可能暗藏了未知的隐患。

你还遇到过什么反直觉的程序结果?欢迎在留言区分享。

如果本文对你有帮助,欢迎点赞、评论、转发。你们的支持是我更新的动力~


添加微信 crossin123 ,加入编程教室共同学习~
感谢转发点赞的各位~

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/193419