作者: andylin02
学习章节: 全书90条建议速查表
关键词: Effective Python, 90条建议, Python进阶, 最佳实践
《Effective Python(第2版)》90条建议完整列表
第1章:培养Pythonic思维(第1条~第10条)
- 第1条:查询自己使用的Python版本
- 第2条:遵循PEP 8风格指南
- 第3条:了解bytes与str的区别
- 第4条:用f-string取代C风格的格式字符串与str.format方法
- 第5条:用辅助函数取代复杂的表达式
- 第6条:把数据结构直接拆分到多个变量里,不要专门通过下标访问
- 第7条:尽量用enumerate取代range
- 第8条:用zip函数同时遍历两个迭代器
- 第9条:不要在for与while循环后面写else块
- 第10条:用赋值表达式减少重复代码
第2章:列表与字典(第11条~第18条)
- 第11条:掌握切片操作
- 第12条:避免在切片中同时指定起止和步进
- 第13条:使用带星号的解包操作来捕获不确定数量的元素
- 第14条:用key参数处理复杂的排序逻辑
- 第15条:不要过分依赖字典的插入顺序
- 第16条:用get处理缺失的字典键
- 第17条:用defaultdict处理缺失的字典键,而不是setdefault
- 第18条:通过实现__missing__方法构造依赖键的默认值
第3章:函数(第19条~第26条)
- 第19条:不要把函数返回的多个值拆分到三个以上变量中
- 第20条:遇到意外状况时应该抛出异常,不要返回None
- 第21条:了解如何在闭包里面使用外围作用域中的变量
- 第22条:用数量可变的位置参数给函数设计清晰的参数列表
- 第23条:用关键字参数给函数设计清晰的参数列表
- 第24条:用None和文档字符串来描述动态默认参数
- 第25条:用仅限关键字参数和位置参数来设计清晰的函数接口
- 第26条:用functools.wraps定义函数装饰器
第4章:推导与生成(第27条~第36条)
- 第27条:用列表推导取代map与filter
- 第28条:在推导式中避免使用超过两个控制子表达式
- 第29条:用赋值表达式消除推导中的重复计算
- 第30条:考虑用生成器代替返回列表
- 第31条:当心迭代器参数的多次遍历
- 第32条:对于大数据量的推导,考虑用生成器表达式
- 第33条:用yield from组合多个生成器
- 第34条:不要用send向生成器注入数据
- 第35条:不要用throw改变生成器的状态
- 第36条:考虑用itertools来拼合迭代器与生成器
第5章:类与接口(第37条~第43条)
- 第37条:用组合代替多层嵌套的内置类型
- 第38条:让简单的接口接受函数,而不是类的实例
- 第39条:使用@classmethod实现多态构造
- 第40条:用super来初始化父类
- 第41条:使用Mixin类来混合功能
- 第42条:优先使用公有属性,而非私有属性
- 第43条:继承collections.abc来定制容器类型
第6章:元类与属性(第44条~第51条)
- 第44条:用纯属性取代getter和setter方法
- 第45条:使用@property替代属性重构
- 第46条:用描述符复用@property验证逻辑
- 第47条:使用__getattr__实现惰性属性
- 第48条:使用__init_subclass__验证子类定义
- 第49条:使用__init_subclass__注册已有的类
- 第50条:使用__set_name__为类属性加上注解
- 第51条:优先使用类装饰器而不是元类
第7章:并发与并行(第52条~第59条)
- 第52条:明白线程、子进程与协程的区别
- 第53条:使用threading处理阻塞式I/O,但避开GIL限制
- 第54条:使用multiprocessing绕过GIL,实现真正并行
- 第55条:使用asyncio编写高并发I/O程序
- 第56条:使用Queue协调线程之间的工作
- 第57条:使用concurrent.futures简化并发执行
- 第58条:避免竞态条件
- 第59条:避免死锁
第8章:稳定性与性能(第60条~第68条)
- 第60条:用raise合理利用异常
- 第61条:使用raise from表达异常链
- 第62条:使用with语句管理资源和上下文
- 第63条:使用tracemalloc追踪内存使用
- 第64条:使用timeit和cProfile分析性能
- 第65条:使用__slots__减少内存开销
- 第66条:了解字符串驻留与intern
- 第67条:用弱引用防止内存泄漏
- 第68条:正确选择和实现容器
第9章:测试与调试(第69条~第76条)
- 第69条:使用unittest编写测试
- 第70条:用setUp与tearDown隔离测试
- 第71条:使用Mock测试复杂依赖
- 第72条:封装依赖以便于模拟
- 第73条:使用交互式调试器
- 第74条:使用内置的pdb模块
- 第75条:用repr字符串输出调试信息
- 第76条:使用tracemalloc追踪内存泄漏
第10章:协作开发(第77条~第90条)
- 第77条:用包来组织代码
- 第78条:使用恰当的导入方式
- 第79条:用__all__控制导出的内容
- 第80条:小心在包的__init__中导入模块
- 第81条:尊重标准库
- 第82条:用一致的风格编写文档字符串
- 第83条:为每个函数、类和模块编写文档字符串
- 第84条:保持模块名称简单且唯一
- 第85条:使用main函数
- 第86条:定义经过良好测试的稳定API接口
- 第87条:了解模块级别的可执行代码
- 第88条:让代码兼容多个Python版本
- 第89条:使用虚拟环境隔离依赖
- 第90条:检查包的发行版是否正确
本文为个人学习笔记,仅用于知识分享。如有错误,欢迎指正。
👍🏻 点赞 + 收藏 + 分享,让更多开发者看到这篇深度解析!❤️ 如果觉得有用,请给个赞支持一下作者!