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 】
相关推荐:
Windows10如何重置此电脑_Windows10电脑重置方法【步骤】
php打包exe后无法写入文件_权限问题解决方法【教程】
如何在Golang中处理云原生事件_使用Event和Notification机制
PyTorch DDP 多进程训练在 Kaggle 笔记本中的正确启动方式
Windows10电脑怎么设置虚拟内存_Win10高级系统设置性能
php中self::能调用子类重写的方法吗_静态绑定与重写关系【介绍】
Python数据挖掘进阶教程_分类回归与聚类案例解析
如何在 ACF 中正确更新嵌套多层 Group 字段内的子字段
如何使用Golang模拟请求超时_Golang context与HTTP请求测试实践
Python日志系统设计与实现_高可观测性架构实战
如何在JavaScript中动态拼接PHP的base_url与前端变量
Win11如何设置开机自动联网 Win11宽带连接自动拨号【步骤】
Python深度学习实战教程_神经网络模型构建与训练
c++怎么使用std::unique实现去重_c++ 容器元素排序与连续重复删除【教程】
Python网页解析流程_html结构说明【指导】
如何使用Golang实现容器安全扫描_Golang Docker镜像漏洞检测方法
Win11怎么更改输入法顺序_Win11调整语言首选位置【设置】
Mac怎么给文件夹加密_Mac创建加密磁盘映像教程【安全】
Win11怎么开启专注模式_Windows11时钟应用Focus Session
Python变量绑定机制_引用模型解析【教程】
C#怎么创建控制台应用 C# Console App项目创建方法
Win11怎么查看电脑配置_Win11硬件配置详细查询方法【详解】
如何在Golang中处理JSON字段缺失_Golangjson解析字段校验方法
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
Windows怎样关闭锁屏广告_Windows关闭锁屏广告方法【教程】
c++协程和线程的区别 c++异步编程模型对比【核心】
如何使用Golang实现文件追加操作_向已有文件追加数据
c++怎么处理多线程死锁_c++ lock_guard与unique_lock锁管理【技巧】
C++中的constexpr和const有什么区别?(编译期常量)
Win11如何开启系统更新 Win11开启系统更新方法【步骤】
Windows10任务栏图标变成白色文件_Win10重建图标缓存修复方法
Golang如何测试HTTP中间件_Golang HTTP中间件功能测试实践
MAC如何启用访达侧边栏显示_MAC Finder偏好设置与常用目录添加【教程】
如何在同包不同文件中正确引用 Go 结构体
网站体验不好=浪费钱:如何提升-用户体验效果差
PythonPandas数据分析教程_数据清洗与处理技巧
mac怎么分屏_MAC双屏显示与分屏操作技巧【指南】
VSC怎么快速定位PHP错误行_错误追踪设置法【方法】
Win11怎么关闭定位服务_保护Win11位置隐私设置指南【详解】
Win11怎么关闭任务栏小组件_Windows11隐藏任务栏天气图标
如何用::实现工具类方法调用_php静态工具类设计技巧【技巧】
XML的“混合内容”是什么 怎么用DTD或XSD定义
Python数据抓取合法性_合规说明【指导】
Win10怎样清理C盘阿里旺旺缓存_Win10清理阿里旺旺缓存步骤【步骤】
如何在 PHP 中按相同键合并两个关联数组为二维数组
如何提升Golang JSON序列化性能_Golang JSON编码效率优化方法
Win11怎么关闭触摸键盘图标_Windows11任务栏系统托盘设置
Mac如何开启夜览模式_Mac护眼模式设置与定时
Linux如何使用grep搜索文件内容_Linux下正则表达式匹配与查找技巧【指南】
c++ std::future和std::promise c++线程间通信【教程】
2026-01-01
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。