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

迭代器和生成器的区别与联系

目录

1.可迭代对象 (Iterable)

2.迭代器 (Iterator)

3.生成器 (Generator)

3.1生成器函数 vs 生成器表达式

4.三者之间的联系与区别

5.关系图(帮助你一眼看懂)

6.核心结论(记住这三句话)


1.可迭代对象 (Iterable)

定义:
实现了 __iter__() 方法的对象,可以被 iter() 转换成迭代器。

特点:

  • 只能通过 iter() 生成迭代器,不能直接 next()
  • 常见例子:listtuplestrdictsetrange
  • for 循环背后就是在调用 iter() 得到迭代器,然后不断 next()

示例:

nums = [1, 2, 3]          # list 是可迭代对象
it = iter(nums)           # 调用 __iter__ 得到迭代器
print(next(it))           # 1

2.迭代器 (Iterator)

定义:
同时实现了 __iter__()__next__() 方法的对象。

特点:

  • 可以直接用 next() 获取下一个值。
  • 取尽所有元素后,会抛出 StopIteration
  • 迭代器本身也是可迭代对象(它的 __iter__() 返回自己)。
  • 可以通过 iter() 从可迭代对象获得迭代器,或者手写迭代器类。

示例:

# 从可迭代对象得到迭代器
it = iter([1, 2, 3])
print(next(it))  # 1# 手写迭代器类
class MyIterator:def __init__(self):self.n = 0def __iter__(self):return selfdef __next__(self):if self.n < 3:value = self.nself.n += 1return valueelse:raise StopIterationit2 = MyIterator()
print(next(it2))  # 0

3.生成器 (Generator)

定义:
一种特殊的迭代器,通过 函数 + yield 创建,Python 自动帮我们实现 __iter__()__next__()

特点:

  • 生成器对象既是迭代器,也是可迭代对象。
  • 每次执行到 yield 暂停,返回值,下次从暂停处继续执行。
  • 自动处理状态保存和 StopIteration,写起来更简洁。

示例:

def my_gen():yield 0yield 1yield 2gen = my_gen()  # 直接就是迭代器
print(next(gen))  # 0
print(next(gen))  # 1
3.1生成器函数 vs 生成器表达式

对比点

生成器函数

生成器表达式

定义方式

def + yield

圆括号 ()

代码结构

支持多行、复杂逻辑

一行表达式,简洁

可读性

更适合复杂逻辑

更适合简单逻辑

可传参

可以通过调用函数传入参数

参数一般在表达式里定义

返回值

返回生成器对象

返回生成器对象

它们的联系:

  • 本质相同:两者返回的都是生成器对象,本质上都是迭代器。
  • 使用方式相同:都可以用 next()for 循环来取值。
  • 选择依据
    • 如果逻辑简单,用生成器表达式。
    • 如果逻辑复杂(需要多行代码、条件分支等),用生成器函数。

4.三者之间的联系与区别

特性

可迭代对象 (Iterable)

迭代器 (Iterator)

生成器 (Generator)

__iter__

 有

自动实现

__next__

没有

自动实现

是否可直接 next()

 否

状态保存

不保存

手动维护

自动维护

停止迭代方式

需先转迭代器再判断

手动抛 StopIteration

自动抛出 StopIteration

创建方式

list、tuple 等内置类型

手写类 or iter(obj)

函数+yield


5.关系图(帮助你一眼看懂)

可迭代对象 (Iterable)
│  有 __iter__()
▼
iter() 函数
▼
迭代器 (Iterator)
│  有 __iter__() 和 __next__()
│  可用 next() 获取值
│
└─> 生成器 (Generator) 是一种特殊的迭代器
(自动实现 __iter__ 和 __next__)

6.核心结论(记住这三句话)

  1. 可迭代对象:有 __iter__,不能直接 next(),要先用 iter() 转换。
  2. 迭代器:有 __iter__ + __next__,能直接 next(),可以手写也可以用 iter() 获得。
  3. 生成器:就是“自动实现了迭代器协议”的函数产物,写起来更简洁。

这样梳理之后,你会发现:

  • 生成器 = 自动实现的迭代器
  • 迭代器 = 可以手写,也可以由 iter() 或生成器自动得到
  • 可迭代对象 = 可以转换成迭代器的对象

文章转载自:

http://Ks0421Ht.jcypk.cn
http://cHeGRZ2X.jcypk.cn
http://cxaWNHG9.jcypk.cn
http://iVjd69wu.jcypk.cn
http://tOqdNYfU.jcypk.cn
http://zIgkQHed.jcypk.cn
http://6CRctEHJ.jcypk.cn
http://wQpPhMzm.jcypk.cn
http://3RlOjNXu.jcypk.cn
http://Mh7e6VVu.jcypk.cn
http://oEiinOZj.jcypk.cn
http://ipUVxFch.jcypk.cn
http://FpXieGJ8.jcypk.cn
http://pB87O5Rj.jcypk.cn
http://xwEwZaMb.jcypk.cn
http://hlOd2JNK.jcypk.cn
http://UjNVFgAP.jcypk.cn
http://k0PmPkJo.jcypk.cn
http://ljF3NEpB.jcypk.cn
http://tu3nHIYt.jcypk.cn
http://iTQIxL8g.jcypk.cn
http://c42tzUAd.jcypk.cn
http://NixXETrh.jcypk.cn
http://misNgBRO.jcypk.cn
http://TzCX9iJJ.jcypk.cn
http://gzBuvqpL.jcypk.cn
http://IvjREaoD.jcypk.cn
http://a352Te5m.jcypk.cn
http://ehTHhF9F.jcypk.cn
http://M32cU7Ho.jcypk.cn
http://www.dtcms.com/a/383288.html

相关文章:

  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘numpy’ 问题
  • ffplay数据结构分析
  • 我爱学算法之—— 位运算(上)
  • LeetCode 分类刷题:2187. 完成旅途的最少时间
  • Redis持久化之AOF:日志记录的艺术,数据安全保障详解
  • 应急响应-事件处理学习大纲(1)
  • 基于「YOLO目标检测 + 多模态AI分析」的遥感影像目标检测分析系统(vue+flask+数据集+模型训练)
  • 【Android】Viewpager2实现无限轮播图
  • 【前端教程】从基础到优化:一个登录页面的完善过程
  • 一文入门python中的进程、线程和协程
  • Tempus Fugit: 3靶场
  • XXL-JOB-Admin后台手动执行任务传参过长被截断问题解决
  • 【AI推理部署】Docker篇02—Docker 快速入手
  • 【C语言描述】《数据结构和算法》一 绪论与时间、空间复杂度
  • 服务器 - 从一台服务器切换至另一台服务器(损失数十条访客记录)
  • 【Android】View 交互的事件处理机制
  • 软考中级信息安全与病毒防护知识点
  • 贪心算法应用:量子密钥路径选择问题详解
  • 【算法】【链表】160.相交链表--通俗讲解
  • v-model与.aync的区别
  • 淘宝返利app的前端性能优化:从资源加载到首屏渲染的全链路优化
  • 【LeetCode】38. 外观数列
  • ZYNQ7020 Bank划分
  • 【2025】Office核心组件Microsoft word,Excel,PowerPoint详细使用指南
  • ARM编译器的__inline和 __forceinline
  • Zookeeper介绍与部署(Linux)
  • [硬件电路-216]:电场是什么?只有正电荷或只有负电荷,能产生电场吗?
  • pthread_mutex_lock函数深度解析
  • 【记录】初赛复习 Day1
  • 深入理解跳表(Skip List):原理、实现与应用