Python中迭代器和生成器实现懒加载以节省内存,迭代器需实现__iter__和__next__方法,生成器函数用yield简化编写并自动支持状态暂停与恢复。
Python 中的迭代器和生成器是实现懒加载、节省内存的关键工具,尤其在处理大数据流、无限序列或资源受限场景时优势明显。它们不一次性把所有数据装入内存,而是按需产出,让程序更轻量、更可控。
迭代器是实现了 __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 关键字返回值,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) # 每次只处理一个解析后的对象
itertools(如 islice, chain, filterfalse)进一步增强表达力生成器强大但不是万能解药。实际使用中需注意几个关键点:
itertools.islice(gen, 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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。