Python 生成器与迭代器:惰性求值的力量
处理大文件或数据流时,把所有数据加载进内存是不现实的。生成器提供了一种"按需生成"的方式,解决了这个问题。 迭代器协议 Python 的 for 循环本质上是在调用迭代器协议: # for 循环等价于这段代码 it = iter(my_list) # 调用 __iter__,返回迭代器 while True: try: item = next(it) # 调用 __next__,取下一个元素 # 执行循环体 except StopIteration: break 实现了 __iter__ 和 __next__ 的对象就是迭代器。 生成器函数 用 yield 的函数就是生成器函数,调用它返回一个生成器对象: def count_up(start, end): current = start while current <= end: yield current # 暂停,返回 current,等待下次调用 current += 1 for n in count_up(1, 5): print(n) # 1 2 3 4 5 关键在于暂停和恢复:每次 next() 调用,函数从上次 yield 的地方继续执行,直到下一个 yield。 实际用处:处理大文件 # 不好:一次性加载所有行到内存 def read_all_lines(filename): with open(filename) as f: return f.readlines() # 10GB 文件直接 OOM # 好:逐行生成,内存始终只有一行 def read_lines(filename): with open(filename) as f: for line in f: yield line.strip() # 使用 for line in read_lines("huge_file.csv"): process(line) 生成器表达式 列表推导式的"惰性版本": ...