Appearance
高级特性 Advanced Features
欢迎来到 Python 高级特性章节!在这里,你将学习 Python 的强大特性,这些特性能让你的代码更优雅、更高效、更易维护。
为什么学习高级特性?
作为前端开发者,你已经熟悉了一些高级编程概念:
| 前端概念 | Python 对应 | 学习曲线 |
|---|---|---|
| 高阶组件 (HOC) | 装饰器 (Decorators) | ⭐⭐ 中等 |
| Generator 函数 | 生成器 (Generators) | ⭐⭐ 中等 |
| try...finally | 上下文管理器 (with) | ⭐ 简单 |
| Promise/async-await | asyncio/async-await | ⭐⭐⭐ 中等 |
学习目标
完成本章节后,你将能够:
- ✅ 使用装饰器增强函数和类的功能
- ✅ 编写内存高效的生成器处理大数据集
- ✅ 创建自定义上下文管理器管理资源
- ✅ 使用 asyncio 编写高性能的异步代码
章节内容
1. 装饰器 (Decorators)
装饰器是 Python 的强大特性,用于在不修改原函数的情况下增强其功能,类似 React 的高阶组件 (HOC)。
核心概念:
- 函数装饰器和类装饰器
@decorator语法糖functools.wraps保留元数据- 带参数的装饰器
- 装饰器堆叠
常见应用:
- 日志记录
- 性能计时
- 缓存 (memoization)
- 权限检查
- 重试逻辑
python
from functools import lru_cache
@lru_cache(maxsize=128)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(100)) # 极速,因为有缓存2. 生成器 (Generators)
生成器使用 yield 关键字实现惰性求值,按需生成值而不是一次性生成所有值,节省内存。
核心概念:
yield关键字yield from委托- 生成器表达式
(x for x in ...) next()和迭代器协议send(),close(),throw()
常见应用:
- 处理大文件 (逐行读取)
- 无限序列 (斐波那契数列)
- 数据管道 (过滤、转换)
- 批量处理
- 树遍历
python
def read_large_file(filename):
"""逐行读取大文件,不占用内存"""
with open(filename) as f:
for line in f:
yield line.strip()
for line in read_large_file("huge.log"):
if "ERROR" in line:
print(line)3. 上下文管理器 (Context Managers)
上下文管理器通过 with 语句确保资源的正确获取和释放,即使发生异常也能保证清理。
核心概念:
with语句__enter__和__exit__魔术方法@contextmanager装饰器contextlib模块工具- 异步上下文管理器 (
async with)
常见应用:
- 文件操作 (自动关闭)
- 锁管理 (自动释放)
- 数据库事务 (自动提交/回滚)
- 临时状态 (目录切换、环境变量)
- 性能分析和计时
python
from contextlib import contextmanager
@contextmanager
def timer(name):
start = time.time()
yield
print(f"{name} took {time.time() - start:.2f}s")
with timer("Data processing"):
process_large_dataset()
# 自动打印执行时间4. 异步编程 (Async Programming)
Python 的 async/await 语法支持异步编程,通过事件循环实现高并发,类似 JavaScript 的 Promise 和 async/await。
核心概念:
async def定义协程await等待异步操作- 事件循环 (Event Loop)
asyncio.create_task()创建任务asyncio.gather()并发执行- 异步上下文管理器和迭代器
常见应用:
- 异步 HTTP 请求
- 异步文件操作
- 异步数据库查询
- WebSocket 通信
- 并发爬虫
python
import asyncio
import httpx
async def fetch_all(urls):
"""并发获取多个 URL"""
async with httpx.AsyncClient() as client:
tasks = [client.get(url) for url in urls]
responses = await asyncio.gather(*tasks)
return [r.json() for r in responses]
urls = ["url1", "url2", "url3"]
results = asyncio.run(fetch_all(urls))学习路径建议
┌─────────────┐
│ 装饰器 │ ← 从这里开始:理解函数增强的概念
│ Decorators │
└──────┬──────┘
│
↓
┌─────────────┐
│ 生成器 │ ← 学习惰性求值和内存优化
│ Generators │
└──────┬──────┘
│
↓
┌─────────────┐
│ 上下文管理器 │ ← 掌握资源管理的最佳实践
│Context Mgrs │
└──────┬──────┘
│
↓
┌─────────────┐
│ 异步编程 │ ← 最后学习:需要前面的知识基础
│ Async │
└─────────────┘推荐学习顺序:
- 装饰器 - 相对独立,类似前端 HOC,容易上手
- 生成器 - 理解迭代器协议,为异步编程打基础
- 上下文管理器 - 学习资源管理,异步中会用到
- 异步编程 - 综合运用前面的知识
快速参考
装饰器
python
@timer
@cache
def expensive_function(n):
return n ** 2生成器
python
# 生成器函数
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
# 生成器表达式
squares = (x**2 for x in range(1000000))上下文管理器
python
# 使用 with 语句
with open("file.txt") as f:
content = f.read()
# 自定义上下文管理器
@contextmanager
def custom_context():
setup()
yield
cleanup()异步编程
python
async def main():
results = await asyncio.gather(
fetch_data(1),
fetch_data(2),
fetch_data(3)
)
return results
asyncio.run(main())与前端技术对比
| Python 特性 | 前端对应 | 相似度 |
|---|---|---|
| 装饰器 | HOC, Decorators (TC39) | ⭐⭐⭐⭐ 高 |
| 生成器 | Generator 函数 | ⭐⭐⭐⭐ 高 |
| 上下文管理器 | try...finally, using (TC39) | ⭐⭐⭐ 中 |
| async/await | Promise, async/await | ⭐⭐⭐⭐⭐ 极高 |
实战建议
何时使用装饰器?
- ✅ 需要为多个函数添加相同的功能(日志、缓存、权限)
- ✅ 不想修改原函数实现
- ✅ 需要在函数前后执行额外逻辑
何时使用生成器?
- ✅ 处理大数据集,一次性加载到内存会溢出
- ✅ 需要无限序列
- ✅ 构建数据处理管道
- ❌ 需要多次遍历同一数据(生成器只能遍历一次)
何时使用上下文管理器?
- ✅ 需要确保资源被正确释放(文件、锁、连接)
- ✅ 需要在代码块前后执行设置和清理
- ✅ 希望代码更简洁、异常更安全
何时使用异步编程?
- ✅ I/O 密集型任务(网络请求、文件操作、数据库)
- ✅ 需要高并发
- ✅ 实时应用(WebSocket、SSE)
- ❌ CPU 密集型任务(用多进程更好)
下一步
选择一个章节开始学习:
准备好深入 Python 高级特性了吗?让我们开始吧!