Python 实战开发指南
目录
1. 1. Python 核心语法
1.1. 数据模型与魔法方法
1.1.1. 对象标识与相等性
1.1.1.1. 易错点:
is
vs
==
1.1.2. 可变性与哈希
1.1.2.1. 可变对象不可哈希
1.1.2.2. 字典键必须可哈希
1.1.3. 自定义类的魔法方法
1.1.3.1.
__repr__
vs
__str__
1.1.3.2. 实现可比较的类
1.1.4. 容器协议
1.1.4.1. 实现自定义序列
1.1.5. 属性访问控制
1.1.5.1.
__getattr__
vs
__getattribute__
1.1.5.2. 使用
__slots__
优化内存
1.1.6. 运算符重载
1.1.6.1. 数值运算
1.1.7. 最佳实践总结
1.2. 函数进阶
1.2.1. 参数传递机制
1.2.1.1. 易错点:传值 vs 传引用
1.2.2.
*args
和
**kwargs
1.2.2.1. 位置参数与关键字参数
1.2.2.2. 仅位置参数(Python 3.8+)
1.2.2.3. 参数解包
1.2.3. 闭包
1.2.3.1. 闭包原理
1.2.3.2. 易错点:循环中的闭包
1.2.4. 装饰器
1.2.4.1. 基本装饰器
1.2.4.2. 带参数的装饰器
1.2.4.3. 类装饰器
1.2.4.4. 装饰器执行顺序
1.2.5. 函数式编程
1.2.5.1. map, filter, reduce
1.2.5.2. 偏函数
1.2.5.3. operator 模块
1.2.6. 最佳实践
1.3. 面向对象编程
1.3.1. 类与实例
1.3.1.1. 类属性 vs 实例属性
1.3.1.2. 可变类属性陷阱
1.3.2. 继承与组合
1.3.2.1. 方法解析顺序(MRO)
1.3.2.2. 组合优于继承
1.3.3. 属性(Property)
1.3.3.1. 使用 @property 实现访问控制
1.3.3.2. 只读属性
1.3.4. 描述符
1.3.5. 抽象基类
1.3.6. 数据类(Python 3.7+)
1.3.7. 元类
1.3.7.1. 使用
__init_subclass__
替代简单元类
1.3.8. 最佳实践
1.4. 迭代器与生成器
1.4.1. 迭代协议
1.4.1.1. 可迭代对象 vs 迭代器
1.4.1.2. 自定义迭代器
1.4.1.3. 可重复使用的迭代器
1.4.2. 生成器
1.4.2.1. 基本生成器
1.4.2.2. 生成器 vs 列表的内存对比
1.4.2.3. yield from
1.4.2.4. 生成器的 send 和 throw
1.4.3. itertools 模块
1.4.3.1. 无限迭代器
1.4.3.2. 组合迭代器
1.4.3.3. 过滤和分组
1.4.3.4. 实用工具
1.4.4. 实际应用
1.4.4.1. 分块处理
1.4.4.2. 滑动窗口
1.4.4.3. 管道处理
1.4.5. 最佳实践
1.5. 上下文管理器
1.5.1. 基本概念
1.5.1.1. with 语句原理
1.5.2. 实现上下文管理器
1.5.2.1. 类方式
1.5.2.2. 使用 contextlib
1.5.2.3. 异常处理
1.5.3. 实用上下文管理器
1.5.3.1. 临时修改
1.5.3.2. 数据库事务
1.5.3.3. 锁管理
1.5.4. 多个上下文管理器
1.5.4.1. ExitStack:动态管理多个上下文
1.5.5. 异步上下文管理器
1.5.6. 最佳实践
1.6. 装饰器深入
1.6.1. 装饰器本质
1.6.2. 保持函数元信息
1.6.3. 常见装饰器模式
1.6.3.1. 带参数的装饰器
1.6.3.2. 可选参数的装饰器
1.6.3.3. 带状态的装饰器(类实现)
1.6.3.4. 缓存装饰器
1.6.3.5. 类型检查装饰器
1.6.4. 装饰类
1.6.4.1. 添加方法到类
1.6.4.2. 注册模式
1.6.5. 方法装饰器
1.6.5.1. 静态方法和类方法
1.6.5.2. property 装饰器
1.6.6. 异步装饰器
1.6.7. 装饰器执行顺序
1.6.8. 最佳实践
1.7. 类型提示
1.7.1. 基础类型提示
1.7.1.1. 基本类型
1.7.1.2. 容器类型
1.7.2. Optional 和 Union
1.7.3. Callable 和函数类型
1.7.4. 泛型
1.7.4.1. TypeVar
1.7.4.2. Generic 类
1.7.5. Protocol(结构化子类型)
1.7.6. TypedDict
1.7.7. Literal 和 Final
1.7.8. 实用类型
1.7.8.1. Any、Never、NoReturn
1.7.8.2. Self(Python 3.11+)
1.7.8.3. Annotated
1.7.9. 类型检查工具
1.7.9.1. mypy
1.7.9.2. 配置文件(mypy.ini 或 pyproject.toml)
1.7.9.3. 内联忽略
1.7.10. 最佳实践
1.8. 核心概念速览
1.8.1. 一切皆对象
1.8.2. 动态类型 vs 鸭子类型
1.9. 本章重点
2. 2. 并发异步编程
2.1. GIL 深度解析
2.1.1. 什么是 GIL
2.1.2. GIL 的工作原理
2.1.2.1. GIL 释放时机
2.1.3. GIL 的影响
2.1.3.1. CPU 密集型任务
2.1.3.2. I/O 密集型任务
2.1.4. 绕过 GIL 的方法
2.1.4.1. 1. 多进程
2.1.4.2. 2. 使用释放 GIL 的库
2.1.4.3. 3. Cython 释放 GIL
2.1.4.4. 4. 使用其他 Python 实现
2.1.5. 线程安全的编程
2.1.5.1. 使用锁
2.1.5.2. 使用原子操作
2.1.5.3. threading.local
2.1.6. 最佳实践
2.1.7. Python 3.12+ 的变化
2.2. 多线程编程
2.2.1. 基础使用
2.2.1.1. 创建线程
2.2.1.2. 线程属性
2.2.2. 线程同步
2.2.2.1. Lock(互斥锁)
2.2.2.2. RLock(可重入锁)
2.2.2.3. Semaphore(信号量)
2.2.2.4. Event(事件)
2.2.2.5. Condition(条件变量)
2.2.2.6. Barrier(屏障)
2.2.3. 线程池
2.2.4. 避免死锁
2.2.4.1. 死锁示例
2.2.4.2. 避免死锁的方法
2.2.5. 线程安全的数据结构
2.2.6. 最佳实践
2.3. 多进程编程
2.3.1. 基础使用
2.3.1.1. 创建进程
2.3.1.2. 进程池
2.3.1.3. ProcessPoolExecutor(推荐)
2.3.2. 进程间通信
2.3.2.1. Queue(队列)
2.3.2.2. Pipe(管道)
2.3.2.3. 共享内存
2.3.2.4. Manager(共享复杂对象)
2.3.3. 进程同步
2.3.3.1. Lock 和 RLock
2.3.3.2. Semaphore
2.3.3.3. Event
2.3.4. 实用模式
2.3.4.1. 工作池模式
2.3.4.2. 分块处理
2.3.4.3. 超时处理
2.3.4.4. 错误处理
2.3.5. 注意事项
2.4. asyncio 异步编程
2.4.1. 基础概念
2.4.1.1. 协程(Coroutine)
2.4.1.2. 事件循环
2.4.2. 任务管理
2.4.2.1. 创建任务
2.4.2.2. gather vs wait
2.4.2.3. 超时控制
2.4.3. 同步原语
2.4.3.1. Lock
2.4.3.2. Semaphore
2.4.3.3. Event
2.4.3.4. Queue
2.4.4. 异步迭代器和生成器
2.4.4.1. 异步迭代器
2.4.4.2. 异步生成器
2.4.5. 异步上下文管理器
2.4.6. 与阻塞代码集成
2.4.6.1. 运行阻塞代码
2.4.6.2. 从同步代码调用异步
2.4.7. 最佳实践
2.5. 并发编程模式
2.5.1. 生产者-消费者模式
2.5.1.1. 异步版本
2.5.1.2. 多进程版本
2.5.2. 工作池模式
2.5.3. 限流模式
2.5.3.1. 令牌桶
2.5.3.2. Semaphore 限流
2.5.4. 重试模式
2.5.5. 超时与取消模式
2.5.6. 熔断器模式
2.5.7. 最佳实践总结
2.6. 并发 vs 并行
2.6.1. 概念区分
2.6.2. Python 并发模型选择
2.7. 快速对比
2.7.1. 性能对比(10 个 I/O 任务)
2.7.2. 性能对比(CPU 密集型任务)
2.8. 本章重点
2.9. 选型指南
3. 3. Web 开发
3.1. FastAPI 实战
3.1.1. 快速入门
3.1.1.1. 基础应用
3.1.1.2. 请求体与 Pydantic
3.1.2. 依赖注入
3.1.2.1. 基础依赖
3.1.2.2. 类作为依赖
3.1.3. 路由组织
3.1.3.1. 使用 APIRouter
3.1.4. 中间件
3.1.5. 异常处理
3.1.6. 后台任务
3.1.7. 数据库集成
3.1.7.1. SQLAlchemy 异步
3.1.8. 测试
3.1.9. 最佳实践
3.2. Flask 实战
3.2.1. 快速入门
3.2.1.1. 基础应用
3.2.1.2. 应用工厂模式
3.2.2. 蓝图(Blueprint)
3.2.3. 请求处理
3.2.3.1. 获取请求数据
3.2.3.2. 响应处理
3.2.4. 数据库操作
3.2.4.1. SQLAlchemy 模型
3.2.4.2. 数据库查询
3.2.4.3. 事务处理
3.2.5. 认证与授权
3.2.5.1. Flask-Login 集成
3.2.5.2. JWT 认证
3.2.6. 中间件和钩子
3.2.7. 测试
3.2.8. 部署
3.2.8.1. Gunicorn
3.2.8.2. Docker
3.2.9. 最佳实践
3.3. RESTful API 设计
3.3.1. REST 原则
3.3.1.1. 资源命名
3.3.1.2. HTTP 方法语义
3.3.1.3. 状态码
3.3.2. 请求与响应设计
3.3.2.1. 统一响应格式
3.3.2.2. 错误响应
3.3.3. 版本控制
3.3.3.1. URL 版本
3.3.3.2. 请求头版本
3.3.4. 过滤、排序、分页
3.3.5. HATEOAS(超媒体)
3.3.6. API 文档
3.3.6.1. OpenAPI 增强
3.3.7. 最佳实践
3.4. Web 安全
3.4.1. 输入验证
3.4.1.1. SQL 注入防护
3.4.1.2. XSS 防护
3.4.1.3. CSRF 防护
3.4.2. 认证安全
3.4.2.1. 密码处理
3.4.2.2. JWT 安全
3.4.2.3. Rate Limiting
3.4.3. 安全响应头
3.4.4. 敏感数据处理
3.4.4.1. 日志脱敏
3.4.4.2. 响应数据过滤
3.4.5. 文件上传安全
3.4.6. 安全检查清单
3.5. 框架对比
3.6. 快速对比
3.6.1. FastAPI
3.6.2. Flask
3.7. 选择建议
3.8. 项目结构
3.8.1. 推荐的 FastAPI 项目结构
3.8.2. 推荐的 Flask 项目结构
3.9. 开发环境设置
4. 4. Python 陷阱
4.1. 常见错误
4.1.1. 可变对象陷阱
4.1.1.1. 可变默认参数
4.1.1.2. 列表浅复制
4.1.1.3. 列表乘法创建二维数组
4.1.2. 作用域问题
4.1.2.1. UnboundLocalError
4.1.2.2. nonlocal 与嵌套函数
4.1.3. 迭代陷阱
4.1.3.1. 修改正在迭代的容器
4.1.3.2. 迭代器耗尽
4.1.3.3. zip 的最短原则
4.1.4. 比较陷阱
4.1.4.1. is vs ==
4.1.4.2. 浮点数比较
4.1.4.3. 链式比较
4.1.5. 字符串陷阱
4.1.5.1. 字符串不可变
4.1.5.2. 编码问题
4.1.6. 异常处理陷阱
4.1.6.1. 捕获过于宽泛的异常
4.1.6.2. finally 中的 return
4.1.6.3. 异常中的变量作用域
4.1.7. 最佳实践总结
4.2. 性能陷阱
4.2.1. 循环优化
4.2.1.1. 避免在循环中重复计算
4.2.1.2. 列表推导 vs 循环
4.2.1.3. 使用生成器节省内存
4.2.2. 数据结构选择
4.2.2.1. 列表 vs 集合查找
4.2.2.2. 合适的数据结构
4.2.2.3. 字符串拼接
4.2.3. 函数调用开销
4.2.3.1. 避免不必要的函数调用
4.2.3.2. 使用内置函数
4.2.4. I/O 优化
4.2.4.1. 批量读写
4.2.4.2. 使用 pickle 的正确方式
4.2.5. 数值计算
4.2.5.1. 使用 NumPy
4.2.5.2. 避免不必要的类型转换
4.2.6. 缓存
4.2.6.1. 使用 functools.lru_cache
4.2.6.2. 自定义缓存
4.2.7. 性能分析工具
4.2.7.1. 使用 cProfile
4.2.7.2. 使用 line_profiler
4.2.8. 最佳实践
4.3. 内存问题
4.3.1. 引用计数与循环引用
4.3.1.1. 引用计数基础
4.3.1.2. 循环引用
4.3.1.3. 检测内存泄漏
4.3.2. 大对象处理
4.3.2.1. 生成器代替列表
4.3.2.2. 分块处理大文件
4.3.2.3. numpy 内存映射
4.3.3.
slots
优化
4.3.4. 字符串驻留
4.3.5. 缓存注意事项
4.3.5.1. lru_cache 内存泄漏
4.3.5.2. 全局缓存增长
4.3.6. 内存分析工具
4.3.6.1. memory_profiler
4.3.6.2. objgraph
4.3.6.3. tracemalloc
4.3.7. 最佳实践
4.4. 调试技巧
4.4.1. 打印调试
4.4.1.1. f-string 调试(Python 3.8+)
4.4.1.2. 漂亮打印
4.4.1.3. 结构化输出
4.4.2. 断点调试
4.4.2.1. 内置 breakpoint()
4.4.2.2. 条件断点
4.4.2.3. ipdb(增强版 pdb)
4.4.3. 日志调试
4.4.3.1. 配置日志
4.4.3.2. 日志装饰器
4.4.4. 追踪执行
4.4.4.1. trace 模块
4.4.4.2. sys.settrace
4.4.5. 性能分析
4.4.5.1. cProfile
4.4.5.2. timeit
4.4.6. 异常调试
4.4.6.1. 打印完整堆栈
4.4.6.2. 自定义异常钩子
4.4.6.3. 断言调试
4.4.7. 调试工具
4.4.7.1. IDE 调试器
4.4.7.2. 远程调试
4.4.8. 最佳实践
4.5. 陷阱分类
4.6. 快速参考:Top 10 陷阱
4.6.1. 1. 可变默认参数
4.6.2. 2. 循环中的闭包
4.6.3. 3. is vs ==
4.6.4. 4. 修改迭代中的列表
4.6.5. 5. 字典迭代时修改
4.6.6. 6. 浮点数比较
4.6.7. 7. 类属性共享
4.6.8. 8. 异常中的 return
4.6.9. 9. GIL 与线程
4.6.10. 10. 作用域陷阱
4.7. 调试快速参考
4.8. 性能检查快速参考
Python 实战开发指南
索引
索引