飞行日志
常用链接
韭菜搞钱
三省吾身
知行合一
📚读书笔记:effective python
type
status
date
slug
summary
tags
category
icon
password
- 确认自己所用的Python版本
- 遵循PEP8风格指南
- 了解bytes、str与unicode的区别
- Python3:bytes和str;
- Python2:str和unicode;
- 用辅助函数来取代复杂的表达式
- 了解切割序列的办法
- 以0开头或end结尾的切割,要省略;
- 在单次切片操作内,不要同时指定start、end和stride
- 三者不要同时使用;尽量避免负数步长;如果同时需要:
- 考虑首次切割范围;再次切割步长
- 使用itertools模块中的islice
- 用列表推导式来取代map和filter
- 不要使用含有两个以上表达式的列表推导
- 使用生成器表达式来改写数据量较大的列表推导
- 尽量用enumerate取代range
- 用zip函数同时遍历两个迭代器
- 不要在for和while循环后面写else块
- 合理利用try/except/else/finnally结构中的每个代码块
- 尽量使用异常来表示特殊情况,而不要返回None
- 抛出异常要写进开发文档中;
- 了解如何在闭包里使用外围作用域中的变量
- 考虑用生成器来改写直接返回列表的函数
- 在参数上面迭代时,要多加小心
- 用数量可变的位置参数减少视觉杂讯(*args)
- 绝对不要给生成器使用*args;如果出现bug,难以排查
- 用关键字参数来表达可选的行为
- 用None和文档字符串来描述具有动态默认值的参数
- 用只能以关键字形式指定的参数来确保代码明晰
- Python3有明确语法支持关键字形式指定的参数;
- Python2的函数可以指定**kwargs参数,并手动抛出TypeError异常来模拟.
- 尽量用辅助类来维护程序的状态,而不要用字典和元组
- 简单的接口应该接受函数,而不是类的实例
- 以 @classmethod 形式的多态去通用的构建对象
- 用super初始化父类
- 只在使用Mix-in组件制作工具类时使用多重继承
- 多用public属性,少用private属性
- 继承collections.abc以实现自定义的容器类型
- 用纯属性取代get和set方法
- 灵活使用 @property 来定义这种行为:遵循最小惊讶原则,需要快速执行
- 考虑用 @property 来代替属性重构
- 如果 @property 使用的太过频繁,就应该考虑彻底重构这件事
- 用描述符来改写需要复用的 @property 方法
- 用__getattr__, __getattribute__和__setattr__实现按需生成的属性
- __getattr__: 在访问不存在的属性是触发;
- __getattribute__: 每次访问属性时触发;
- 使用元类来验证子类
- 使用元类来注册子类
- 使用元类来注解类的属性
- 使用 subprocess 模块来管理子进程
- 可以用线程来执行阻塞式 I/O, 但不要用它做平行计算
- 在线程中使用Lock来防止数据竞争
- 使用Queue来协调各线程之间的工作
- 考虑用协程来并发地运行多个函数
- 考虑用 concurrent.futures 来实现真正的平行计算
- 使用functools.wraps 定义函数修饰器
- 考虑以 contextlib 和 with 语句来改写可复用的 try/finally 代码
- 用copyreg 实现可靠的 pickle 操作
- 应该用datetime模块来处理本地时间,而不是用time模块
- 使用内置算法与数据结构
- 在重视精度的场合,应该使用decimal
- 学会安装由Python开发者社区构建的模块
- 为每个函数、类和模块编写文档字符串
- 用包来安装模块,并提供稳固的API
- 为自编的模块定义根异常,以便将调用者与API相隔离
- 用适当的方式打破循环依赖关系
- 用虚拟环境隔离项目,并重建其依赖关系
- 考虑用模块级别的代码来配置不同的部署环境
- 通过repr字符串来输出调试信息
- 用unittest来测试全部代码
- 考虑用pdb实现交互调试
- 先分析性能,然后再做优化
- 用tracemalloc来掌握内存的使用及泄漏情况