当前位置: 首页 > news >正文

python精讲之迭代器和生成器

在 Python 中,**迭代器(Iterator)生成器(Generator)**都是用于处理可迭代对象的工具,它们支持惰性计算(按需生成值),能高效处理大数据流或无限序列。以下是详细解释和对比:


一、迭代器(Iterator)

核心概念
  1. 定义
    迭代器是实现了迭代器协议的对象,即包含 __iter__()__next__() 方法。
    • __iter__():返回迭代器自身(通常就是 self)。
    • __next__():返回下一个元素,若无元素则抛出 StopIteration 异常。
  1. 特性
    • 惰性求值:一次只生成一个元素,节省内存。
    • 单向遍历:只能前进,不能后退。
    • 一次性使用:遍历结束后需重新创建才能再次迭代。
示例
# 自定义迭代器
class CountDown:def __init__(self, start):self.current = startdef __iter__(self):return selfdef __next__(self):if self.current <= 0:raise StopIterationnum = self.currentself.current -= 1return num# 使用迭代器
countdown = CountDown(3)
for num in countdown:print(num)  # 输出:3, 2, 1

二、生成器(Generator)

核心概念
  1. 定义
    生成器是一种特殊的迭代器,通过函数和 yield 关键字简化创建过程。
    • 函数中使用 yield 代替 return,每次 yield 返回一个值并暂停函数状态。
    • 调用生成器函数返回一个生成器对象(自动实现迭代器协议)。
  1. 特性
    • 更简洁的语法:无需手动定义 __iter__()__next__()
    • 状态保存:函数局部变量和执行状态在 yield 间自动保留。
    • 支持无限序列:如无限计数器。
示例
# 生成器函数
def count_down(start):current = startwhile current > 0:yield current  # 暂停并返回值current -= 1# 使用生成器
gen = count_down(3)
for num in gen:print(num)  # 输出:3, 2, 1# 生成器表达式(类似列表推导式)
gen_expr = (x for x in range(3, 0, -1))
print(list(gen_expr))  # 输出:[3, 2, 1]

三、关键区别

特性

迭代器 (Iterator)

生成器 (Generator)

实现方式

需手动定义 __next__ 方法

yield 自动实现

语法复杂度

较复杂(需写类)

简洁(函数形式)

内存占用

低(惰性计算)

低(惰性计算)

适用场景

自定义复杂迭代逻辑

快速创建惰性序列

状态保存

需手动管理状态

自动保存函数状态


四、常见用法

1. 迭代文件内容(避免一次性加载大文件)
def read_large_file(file_path):with open(file_path, 'r') as file:for line in file:  # 文件对象本身就是迭代器yield line.strip()for line in read_large_file("data.txt"):process(line)  # 逐行处理
2. 生成无限序列
def infinite_counter():count = 0while True:yield countcount += 1gen = infinite_counter()
print(next(gen))  # 0
print(next(gen))  # 1
3. 管道式处理数据流
def filter_even(numbers):for n in numbers:if n % 2 == 0:yield ndef square(numbers):for n in numbers:yield n ** 2# 组合生成器
nums = [1, 2, 3, 4, 5]
pipeline = square(filter_even(nums))
print(list(pipeline))  # 输出:[4, 16]

五、总结

  • 迭代器:基础协议,适合需要精细控制迭代逻辑的场景。
  • 生成器:迭代器的语法糖,更简洁,适合快速创建惰性序列。
  • 共同优势
    ✅ 节省内存(处理大数据)
    ✅ 支持无限序列
    ✅ 兼容 for 循环、next() 等迭代操作

通过合理使用迭代器和生成器,可以显著提升 Python 程序的效率和可读性。


文章转载自:

http://MsgqrZoY.dygsz.cn
http://rVdV68F8.dygsz.cn
http://JEfUkSpw.dygsz.cn
http://ueaRd5jN.dygsz.cn
http://jrShQsfY.dygsz.cn
http://sRNyYkDO.dygsz.cn
http://yVK3AMGC.dygsz.cn
http://LEgfdQU9.dygsz.cn
http://rPNiKdJf.dygsz.cn
http://9Z0A4eOi.dygsz.cn
http://rYEtTuHr.dygsz.cn
http://yE8lmTTN.dygsz.cn
http://JUojNhoP.dygsz.cn
http://K4HFJZ2Y.dygsz.cn
http://qRJGSbIR.dygsz.cn
http://hcySFO4t.dygsz.cn
http://oXM2wBws.dygsz.cn
http://wnFuULmb.dygsz.cn
http://rLz0NLSg.dygsz.cn
http://F0lL4Rxc.dygsz.cn
http://XQr4iUbk.dygsz.cn
http://wl6FJRea.dygsz.cn
http://Te2Swtev.dygsz.cn
http://2mjwxr1G.dygsz.cn
http://aH5KdkFD.dygsz.cn
http://kpjEXWIm.dygsz.cn
http://Hc4Fnm5S.dygsz.cn
http://ErkjayBD.dygsz.cn
http://pPB8OHL8.dygsz.cn
http://G1afs69S.dygsz.cn
http://www.dtcms.com/a/247740.html

相关文章:

  • 宝塔解决同源策略阻挡
  • Google Chrome 书签导出
  • 设备管理-Udev(一)
  • croc-文件传输工具
  • OpenFeign声明式调用实战指南
  • da y30
  • gazebo仿真中对无人机集成的相机进行标定(VINS-Fusion)
  • vue纯前端根据页面或者后台数据,读取本地文档模板,填充数据后并导出
  • KDJ指标的运用
  • VIC-3D应用指南系列之:DIC数字图像相关技术与热成像(VIC-3D IR System助力热载荷测试)
  • 访问者模式:解耦数据结构与操作的优雅之道
  • 数字IC后端实现之Innovus中各种cell名字前缀物理含义
  • Vue3 Element Plus 表格默认显示一行
  • GitHub Actions 深度实践:零运维搭建 CI/CD 流水线
  • React 第六十一节 Router 中 createMemoryRouter的使用详解及案例注意事项
  • SpringBoot+vue前后端分离系统开发(期末)
  • ios 26发布:设计革新与智能整合
  • 26考研 | 王道 | 计算机组成原理 | 六、总线
  • 栈与队列:数据结构优劣全解析
  • react react-router-dom中获取自定义参数v6.4版本之后
  • 域名+nginx反向代理实现案例
  • frida对qt5(32位)实现简单HOOK
  • Oracle 中使用CONNECT BY、START WITH递归查询
  • Dockerfile - 自定义 Nginx 镜像构建
  • 面向对象-对象和属性描述符详解(一)
  • 使用HashMap或者List模拟数据库插入和查询数据
  • java集合(十) ---- LinkedList 类
  • 精准洞察位移变化,位移传感器开启测量新纪元
  • 自适应攻击的强大后门防御
  • 个典型的 Java 泛型在反序列化场景下“类型擦除 + 无法推断具体类型”导致的隐性 Bug