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


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
  • 每次只打开一次文件,每次只读一行,内存占用恒定
  • 使用 for line in LineReader('huge.log'): 即可安全遍历
  • 注意手动关闭文件,或改用上下文管理器(推荐)提升健壮性

掌握生成器:用 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)

  • yield 让函数变成生成器工厂,调用时不执行,只返回生成器对象
  • 每次 next() 触发时,从上次 yield 暂停处继续运行
  • 生成器对象不可重用,用完即弃;需重复遍历时应重新调用生成器函数

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

生成器可以像 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) # 每次只处理一个解析后的对象

  • 每个函数职责单一,易于测试和复用
  • 整个流程不会因文件过大而 OOM,哪怕文件是 GB 级别
  • 可配合 itertools(如 islice, chain, filterfalse)进一步增强表达力

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

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

  • 生成器只能遍历一次,多次使用需重新构造(可包装成类或工厂函数)
  • 调试困难:无法直接索引、切片或查看长度,可用 itertools.islice(gen, 5) 查看前几项
  • 异常传播:若生成器内部抛出异常,会原样传递给调用方,建议在 yield 前加 try/except
  • 协程扩展:Python 3.5+ 中 yield from 支持委托子生成器,async def + await 是异步生成器演进方向


# python  # js  # json  # 大数据  # 工具  # 懒加载  # ai  # unix  # 内存占用 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Win11怎么解压RAR文件 Win11自带解压功能使用方法  Python多进程教程_multiprocessing模块实战  Win11时间格式怎么改成12小时制 Win11时间格式切换教程【步骤】  c# 如何深拷贝和浅拷贝  如何使用Golang构建简易投票统计功能_Golang投票数据汇总与展示示例  Go 中实现 Python urllib.quote() 功能的等效方法  Win11键盘快捷键大全_Windows 11常用高效快捷键汇总【技巧】  php怎么操作Redis_Redis扩展连接与基本命令使用方法【方法】  php怎么连接数据库_MySQL数据库连接的基础代码编写【说明】  Win10任务栏天气和资讯怎么关闭 Win10禁用新闻和兴趣功能【教程】  windows如何测试网速_windows系统网络速度测试方法  Python对象比较与排序_集合使用说明【指导】  Mac如何整理桌面文件_Mac使用堆栈功能一键整理  如何从 Go 的 map[string]interface{} 中安全获取值  C++如何使用std::transform批量处理容器元素?(代码示例)  短链接怎么自定义还原php_修改解码规则适配需求【汇总】  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  Win11怎么清理C盘OneDrive缓存_Win11清理OneDrive缓存技巧【方法】  Win11怎么恢复旧版开始菜单_通过软件还原Win10风格菜单【详解】  Mac如何创建和管理多个桌面空间_Mac高效多任务处理【技巧】  Win11如何设置文件权限 Win11 NTFS文件夹所有权与安全设置【高级】  Win10怎么关闭自动更新错误重启 Win10策略禁止失败补丁强制重启【防护】  如何使用Golang实现聊天室消息存档_存储聊天记录到文件  如何在 Go 中创建包含 map 的 slice(嵌套数据结构)  Go语言中正确反序列化多个同级XML元素为结构体切片的方法  如何在 Go 项目开发中正确处理本地包导入与远程模块路径的一致性问题  Windows10如何查看保存的WiFi密码_Win10命令行netsh wlan查询  如何在 Go 中正确反序列化多个并列的 XML 元素(而非 XML 数组)  Win11怎么压缩文件 Win11自带压缩解压功能使用【教程】  Windows怎样关闭开始菜单推荐广告_Windows关闭开始菜单推荐设置【步骤】  Win11输入法切换快捷键怎么改_Windows 11自定义语言切换键位【教程】  MAC的“接续互通”功能无法使用怎么办_MAC检查蓝牙、Wi-Fi和相同Apple ID登录  如何在Golang中处理云原生事件_使用Event和Notification机制  Win11无法拖拽文件到任务栏怎么办_Win11开启拖放功能修复【方法】  Mac的Time Machine怎么用_Mac系统备份与数据恢复【完整指南】  Python抽象类与接口设计_规范说明【指导】  XSLT怎么生成动态的HTML属性名和标签名  跨文件调用类方法怎么用_php作用域操作符与自动加载配合【介绍】  LINUX怎么设置系统语言_LINUX修改中文环境  php485函数怎么捕获异常_php485错误处理机制设置技巧【操作】  Win10系统怎么查看显卡温度_Win10任务管理器GPU温度  如何使用Golang benchmark测量函数延迟_统计执行耗时  c++20的std::format怎么用 比printf更安全高效的格式化方法【详解】  本地php环境打开php文件直接下载_浏览器解析php为下载的修复方法【解答】  c++ atoi和atof函数用法_c++字符数组转数字  如何在 Go 中正确反序列化 XML 多节点数组(解决仅解析首个元素的问题)  Win11任务栏颜色怎么改_Win11自定义任务栏配色设置【美化】  Win10怎样清理C盘Steam游戏缓存_Win10清理Steam游戏缓存步骤【步骤】  短链接还原php提示内存不足_调整PHP内存限制设置【技巧】  Windows执行文件被SmartScreen拦截原因_安全提示与绕过方式 

 2026-01-01

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.