迭代器、生成器与装饰器
迭代器、生成器与装饰器
可迭代对象
可以被 for 循环遍历的对象就是可迭代对象。
1 | for item in [1, 2, 3]: |
常见可迭代对象:
listtupledictsetstr- 文件对象
- 生成器
迭代器
迭代器实现了:
__iter__()__next__()
1 | numbers = iter([1, 2, 3]) |
生成器函数
使用 yield 的函数会返回生成器。
1 | def countdown(n): |
优点:
- 惰性计算。
- 节省内存。
- 适合处理大文件和流水线。
生成器表达式
1 | total = sum(x * x for x in range(1_000_000)) |
列表推导式会立即创建列表,生成器表达式按需产生值。
装饰器
装饰器本质上是接收函数并返回新函数的函数。
1 | from functools import wraps |
常见用途:
- 日志。
- 权限检查。
- 缓存。
- 计时。
- 参数校验。
带参数的装饰器
1 | from functools import wraps |
常见坑
- 忘记
functools.wraps,导致函数元信息丢失。 - 生成器只能消费一次。
- 把生成器转成列表可能占用大量内存。
- 装饰器里吞掉异常,导致问题难以定位。
练习
- 写一个读取大文件每次返回一行的生成器。
- 写一个计时装饰器。
- 写一个简单缓存装饰器。
- 用生成器表达式处理 100 万个数字并比较内存差异。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Kalax524!