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

目录

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()**或生成器自动得到
  • 可迭代对象 = 可以转换成迭代器的对象
相关推荐
满怀冰雪16 小时前
06-自动微分入门:用 Paddle 计算梯度
人工智能·python·深度学习·paddle
xlrqx1 天前
家电清洗培训课程类别、培训方式及费用情况究竟有哪些
大数据·python
lbb 小魔仙1 天前
VS Code Python 高级调试技巧:从入门到精通
开发语言·python
lzqrzpt1 天前
LED驱动电源行业品牌格局与技术差异深度总结
python·单片机·嵌入式硬件
李可以量化1 天前
PTrade 策略入门:before_trading_start 函数详解(上)—— 盘前准备逻辑全指南
python
大海变好AI1 天前
AIGC分层推理落地能否串联多工具完成自动化闭环
人工智能·python·自动化·aigc
二宝哥1 天前
14.Python模块与包完全指南:从定义到实战
python
三声三视1 天前
交互式用够了?用 Agent SDK 把 Claude 塞进 Python Web 服务
人工智能·python·ai·aigc·ai编程
zhanghaha13141 天前
Python语言基础:4_数据类型转换
java·前端·python
larance1 天前
机器学习特征预处理之标准化/归一化
开发语言·python·机器学习