通八洲科技

Python迭代器生成器进阶教程_节省内存与懒加载实战

日期:2026-01-01 00:00 / 作者:冰川箭仙
Python中迭代器和生成器实现懒加载以节省内存,迭代器需实现__iter__和__next__方法,生成器函数用yield简化编写并自动支持状态暂停与恢复。

Python 中的迭代器和生成器是实现懒加载、节省内存的关键工具,尤其在处理大数据流、无限序列或资源受限场景时优势明显。它们不一次性把所有数据装入内存,而是按需产出,让程序更轻量、更可控。

理解迭代器:可被 next() 驱动的对象

迭代器是实现了 __iter__()__next__() 方法的对象。调用 iter() 得到迭代器,反复调用 next() 获取下一个值,直到抛出 StopIteration 异常为止。

自定义迭代器适合封装有明确状态和逻辑的数据遍历过程。例如,读取大文件时逐行迭代,避免一次性读入全部内容:

class LineReader:
    def __init__(self, filepath):
        self.filepath = filepath
    def __iter__(self):
        return self
    def __next__(self):
        try:
            if not hasattr(self, 'file'):
                self.file = open(self.filepath, 'r', encoding='utf-8')
            line = self.file.readline()
            if not line:
                raise StopIteration
            return line.rstrip('\n')
        except StopIteration:
            self.file.close()
            del self.file
            raise

掌握生成器:用 yield 简化迭代器编写

生成器函数使用 yield 关键字返回值,Python 自动将其编译为迭代器对象。它比手写迭代器更简洁、不易出错,且天然支持暂停/恢复执行状态。

典型场景:生成斐波那契数列、过滤日志、解析流式 JSON:

def fibonacci(max_count):
    a, b, count = 0, 1, 0
    while count < max_count:
        yield a
        a, b = b, a + b
        count += 1

使用方式完全一致

for n in fibonacci(1000000): # 不会创建百万元素列表 if n > 1000: break print(n)

实战技巧:组合与转换生成器链

生成器可以像 Unix 管道一样串联,形成清晰、低耦合的数据处理链。每一步都保持懒加载,整条链仍只占用常量内存。

def read_lines(filepath):
    with open(filepath) as f:
        for line in f:
            yield line.strip()

def filter_nonempty(lines): for line in lines: if line: yield line

def parse_json_lines(lines): import json for line in lines: try: yield json.loads(line) except json.JSONDecodeError: continue

组合使用(无中间列表)

for obj in parse_json_lines(filter_nonempty(read_lines('data.jsonl'))): process(obj) # 每次只处理一个解析后的对象

进阶提醒:生成器的边界与注意事项

生成器强大但不是万能解药。实际使用中需注意几个关键点: