Python 语法精炼3
迭代器机制
在 Python 中,iter() 是一个内置函数,用来从“可迭代对象”中创建一个迭代器对象。
类比理解:
想象你有一本书 📖(列表 [1,2,3])
nums就是整本书(可迭代对象)it = iter(nums)就像拿到一个“书签”(迭代器对象)- 每次
next(it)→ 翻到下一页,读一个内容 - 当读完所有页时,再
next(it)就会报错:StopIteration
思考下面题目👇
1 | nums = [1, 2, 3] |
可迭代对象 vs 迭代器
| 概念 | 含义 | 关键方法 | 示例 |
|---|---|---|---|
| Iterable(可迭代对象) | 能够被“遍历”的对象,可以用 for |
__iter__() |
list, tuple, str, set, dict |
| Iterator(迭代器) | 记得“当前取到哪”的对象,可用 next() |
__iter__() + __next__() |
iter(list) |
🔹 类比:
- Iterable → 书 📖
- Iterator → 书签 🔖
iter()→ 把书变成书签next()→ 翻到下一页
特殊情况
集合 set 是可迭代对象(Iterable),但不是迭代器(Iterator)。
原因:不是“没有顺序”,而是,
它能被遍历,但它自己不会记得“上次取到哪了”。
进行如下验证:
1 | s = {1, 2, 3} |
输出:
1 | True |
✅ 所以 set 是 Iterable(因为有 __iter__ 方法),
❌ 但不是 Iterator(因为没有 __next__ 方法)。
延伸理解
如果想让它“变成”迭代器,怎么办?
1 | it = iter(s) |
这就给集合“加了书签”,it 就变成了一个迭代器对象。
总结一句:
集合是 可迭代对象,但不是 迭代器。
通过iter()可以从集合(或列表、字符串)得到一个迭代器。
生成器机制
生成器是一种惰性计算的迭代器,它不是一次性把所有结果放进内存,而是 “要一个,算一个”。
创建方式
1️⃣ 生成器表达式
1 | g = (x**2 for x in range(5)) |
2️⃣ 生成器函数
1 | def gen(): |
可以思考下面的例子:
1 | def gen(): |
📌 特点:
- 每次
yield暂停执行; - 保存局部状态;
- 内存效率高;
- 可以用
for或next()遍历。
yield vs return
| 项目 | yield |
return |
|---|---|---|
| 功能 | 暂停执行并返回值 | 结束函数执行 |
| 是否保留状态 | ✅ 是 | ❌ 否 |
| 返回值类型 | 生成器对象 | 具体值或None |
| 用法 | 让函数变成生成器函数 | 正常函数返回结果 |
例:
1 | def f(): |
捕获返回值:
1 | g = f() |
委托生成器
yield from 可以让一个生成器把自己的部分工作“委托”给另一个生成器。
1 | def subgen(): |
输出:
1 | start |
📌 功能总结:
- 转发子生成器的所有
yield; - 自动捕获子生成器的
return; - 把返回值赋给左边的变量。
💡 总结:
iter开门,next取值,yield暂停,return结局,yield from接力。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Telason!
