高级特性:迭代器(Iteration)
🧩 为什么需要迭代?
在处理数据时,我们经常需要遍历某个序列,例如:
- 逐行读取一个文件
- 遍历列表中的每个元素
- 遍历字典的键值对
Python 提供了简洁而强大的 for...in
语法来进行迭代,但你是否思考过:for
是如何知道一个对象能不能被“迭代”的?
🔄 可迭代对象(Iterable)
在 Python 中,只要可以被 for...in
使用的对象,都称为“可迭代对象”(Iterable),例如:
- 字符串、列表、元组
- 字典、集合
- 文件对象
- range() 等生成器
我们可以使用内置函数 iter()
检查一个对象是否是可迭代的。
从 collections.abc 导入 迭代协议
打印(实例类型([1, 2, 3], 迭代协议)) # True
打印(实 例类型(123, 迭代协议)) # False
🔁 迭代的原理:for
背后发生了什么?
当你写下:
for x in [1, 2, 3]:
print(x)
其实 Python 在背后会自动执行如下逻辑:
it = 迭代器([1, 2, 3]) # 获取迭代器
判断循环 真:
尝试:
x = 下一个(it)
打印(x)
捕获 停止迭代:
终止
🧩 迭代器(Iterator)和可迭代对象的区别
名称 | 描述 |
---|---|
Iterable(可迭代对象) | 可以被 for...in 遍历的对象(如 list、dict) |
Iterator(迭代器) | 可以用 next() 不断取出下一个元素的对象 |
关系 | Iterator 是一种特殊的 Iterable |
你可以通过 iter()
把一个 Iterable 变成 Iterator,用 next()
取值。
📘 示例:手动遍历列表
lst = [10, 20, 30]
it = 迭代器(lst)
打印(下一个(it)) # 10
打印(下一个(it)) # 20
打印(下一个(it)) # 30
# 打印(下一个(it)) # StopIteration
🛠 自定义可迭代对象
你可以通过实现 __iter__()
和 __next__()
方法来自定义一个可迭代对象。
类 倒计时:
定 __初始化__(self, 开始):
self.当前 = 开始
定 __迭代__(self):
返回 self
定 __下一个__(self):
如果 self.当前 <= 0:
异常 停止迭代
self.当前 -= 1
返回 self.当前 + 1
for i in 倒计时(3):
print(i) # 输出:3 2 1
✅ 总结
概念 | 特征 | 作用 |
---|---|---|
Iterable | 可被 for 遍历的对象 | 包含 __iter__() 方法 |
Iterator | 用 next() 获取下一个值 | 包含 __next__() 方法 |
for 语句 | 会自动调用 iter() 和 next() | 简化了迭代逻辑 |
下一章将介绍 生成器(Generator) —— 构建高效惰性序列的神器。
需要继续为你生成生成器章节吗?