大家好,我是正在实战各种 AI 项目的程序员晚枫。
认识我的朋友都知道,我写 Python 不算晚。但我认真告诉你:直到我仔仔细细读完《流畅的Python(第2版)》,我才意识到,自己之前写的很多代码,其实都是错的——或者说,是”不 Pythonic 的”。
这不是在故意谦虚,我举几个真实的例子。
坏习惯 1:用 len() 判断容器是否为空
我以前写了无数次这样的代码:
1 | if len(my_list) > 0: |
直到书里告诉我,Python 的对象有 __bool__ 和 __len__ 协议。所有内置容器,空时都会被当作 False。
正确写法:
1 | if my_list: |
更简洁,更 Pythonic,运行还更快。这是一个入门级错误,但我写了不知道多少年。
坏习惯 2:用类属性当默认参数
这是个经典陷阱,不是所有人都踩过,但踩过的人都印象深刻:
1 | # 这段代码有严重 bug |
所有实例会共享同一个字典对象,改了一个,其他全部跟着变。
后果:线上偶发性数据污染,极难复现,是噩梦级的调试场景。
我知道这个道理,但我还是在实际项目里犯过。因为我从没系统理解过 Python 的对象引用机制——变量不是”盒子”,而是”便利贴”,贴在对象上的标签。书里用一整章(第9讲)把这个讲透了。
坏习惯 3:不会用装饰器,只会复制粘贴
装饰器用了很多年,但我写过最复杂的装饰器,也就是带一个参数的那种。
直到我读到书里讲装饰器的那章,才知道:
- 装饰器的本质是闭包的应用
functools.wraps为什么必须加——不加的话,被装饰函数的__name__和__doc__会丢失,框架层面可能因此找不到正确的函数元信息- 类装饰器和函数装饰器的适用场景完全不同
- 装饰器叠加时的执行顺序,从外到内
这些东西,网上的教程其实都有,但分散、零碎、语焉不详。这本书是我见过讲得最系统的。
坏习惯 4:觉得生成器和迭代器”差不多”
以前我以为 yield 就是”返回一个值”,和 return 没本质区别。
这是错的。
1 | # 错误认知:生成器和普通函数差不多 |
正确理解:yield 挂起函数执行,保留局部状态;return 终止函数。每次调用 next(),函数从上次 yield 的位置继续执行。
这个区别的实际后果:生成器占用常量级内存,适合处理大数据流。而列表推导式会把所有数据一次性加载进内存,大数据场景下直接 OOM。
更重要的是:生成器是理解 yield from 和协程的基础。yield from 可以把一个生成器的任务委托给子生成器,而协程(async def)本质上是使用 yield 语法的生成器的进化版——这些概念不连起来理解,asyncio 就永远是黑盒。
我的改变
读完《流畅的Python(第2版)》之后,我的代码有什么变化?
- 代码 更短了,但表达力更强
- 重复写的工具函数少了,因为很多 Python 内置就支持
- 同事 code review 的时候,提的问题少了一半
- 面对复杂问题,思路更清晰了——知道该用什么工具
更重要的是:我对 Python 的理解,从”使用者”升级到了”理解者”。
我开设了直播共读课
《流畅的Python(第2版)》是好书,但真的不容易独自啃下来。800 多页,全是干货,很多人买了之后,翻了前三章,就搁置了。
我自己也是读了好几遍,才真正吸收。
所以我开设了这门直播共读课:
- 每周直播,逐章精讲,专门挑”容易写错、容易忽视”的知识点重点讲
- 配套深度文章,帮你梳理、记忆
- 专属学习群,遇到卡点有人一起研究
价格:原价 499 元,试运营期间 299 元。
这个价格不求盈利,只想找一群真心想学的人,一起把这本书读透。
报名方式
添加微信 python-office,备注「流畅的Python」,我来拉你进群。
📖 推荐教材
- 《流畅的 Python(第 2 版)》 - 本课程配套教材
- 《Python 编程从入门到实践(第 3 版)》 - 零基础入门
- 《CPython 设计与实现》 - 源码深度
学习路线: 零基础 → 《从入门到实践》 → 《流畅的 Python》 → 本门课程 → 《CPython 设计与实现》
💬 学习交流
| 平台 | 账号/链接 |
|---|---|
| 微信 | 扫码加好友 |
| B 站 | Python 自动化办公社区 |
开始学习:第 1 讲:Python 数据模型