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

目录

1.可迭代对象 (Iterable)

2.迭代器 (Iterator)

3.生成器 (Generator)

[3.1生成器函数 vs 生成器表达式](#3.1生成器函数 vs 生成器表达式)

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

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

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


1.可迭代对象 (Iterable)

定义:

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

特点:

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

示例:

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

2.迭代器 (Iterator)

定义:

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

特点:

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

示例:

python 复制代码
# 从可迭代对象得到迭代器
it = iter([1, 2, 3])
print(next(it))  # 1

# 手写迭代器类
class MyIterator:
    def __init__(self):
        self.n = 0
    def __iter__(self):
        return self
    def __next__(self):
        if self.n < 3:
            value = self.n
            self.n += 1
            return value
        else:
            raise StopIteration

it2 = MyIterator()
print(next(it2))  # 0

3.生成器 (Generator)

定义:

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

特点:

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

示例:

python 复制代码
def my_gen():
    yield 0
    yield 1
    yield 2

gen = 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.关系图(帮助你一眼看懂)

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

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

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

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

  • 生成器 = 自动实现的迭代器
  • 迭代器 = 可以手写,也可以由 **iter()**或生成器自动得到
  • 可迭代对象 = 可以转换成迭代器的对象
相关推荐
火车叼位4 分钟前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
孤狼warrior14 分钟前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
Katecat9966324 分钟前
YOLO11分割算法实现甲状腺超声病灶自动检测与定位_DWR方法应用
python
玩大数据的龙威1 小时前
农经权二轮延包—各种地块示意图
python·arcgis
ZH15455891311 小时前
Flutter for OpenHarmony Python学习助手实战:数据库操作与管理的实现
python·学习·flutter
belldeep1 小时前
python:用 Flask 3 , mistune 2 和 mermaid.min.js 10.9 来实现 Markdown 中 mermaid 图表的渲染
javascript·python·flask
喵手1 小时前
Python爬虫实战:电商价格监控系统 - 从定时任务到历史趋势分析的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·电商价格监控系统·从定时任务到历史趋势分析·采集结果sqlite存储
喵手1 小时前
Python爬虫实战:京东/淘宝搜索多页爬虫实战 - 从反爬对抗到数据入库的完整工程化方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·京东淘宝页面数据采集·反爬对抗到数据入库·采集结果csv导出
B站_计算机毕业设计之家2 小时前
猫眼电影数据可视化与智能分析平台 | Python Flask框架 Echarts 推荐算法 爬虫 大数据 毕业设计源码
python·机器学习·信息可视化·flask·毕业设计·echarts·推荐算法
PPPPPaPeR.2 小时前
光学算法实战:深度解析镜片厚度对前后表面折射/反射的影响(纯Python实现)
开发语言·python·数码相机·算法