在 Python 中,迭代器和生成器两者有何不同?
考察说明
考查对 Python 迭代协议和生成器机制的理解与区别。
回答思路
- 【回答框架 1】迭代器是实现了迭代协议的对象,即包含 __iter__ 和 __next__ 方法,通过 next() 逐个返回元素,直到抛出 StopIteration。生成器是基于函数或表达式创建的迭代器,使用 yield 关键字,每次调用 next() 时执行到 yield 暂停并返回值,状态自动保留。
- 【回答框架 2】生成器是迭代器的子集,任何生成器都是迭代器,但迭代器不一定是生成器。生成器更简洁,常用于惰性求值,节省内存;自建迭代器类需手动维护状态,代码更冗长。
- 【回答框架 3】区别核心:生成器由 Python 自动管理状态,迭代器需自行实现;生成器用于定义惰性序列,迭代器是通用协议。使用场景:处理大数据流时首先生成器,简单序列可用迭代器。
- 【回答框架 4】两者都只能遍历一次,消耗后无法重置。生成器还支持 send、throw 和 close 方法,用于协程和异常处理,普通迭代器不具备这些功能。
- 【关键点 1】生成器是迭代器的一种,实现迭代协议但更自动。
- 【关键点 2】生成器用 yield,迭代器用 __next__。
- 【关键点 3】生成器惰性求值,省内存。
- 【关键点 4】普通迭代器需手动管理状态。
- 【关键点 5】生成器支持 send 等额外方法。
- 【易错点 1】不能混淆生成器与普通函数,yield 使函数变成生成器。
- 【易错点 2】迭代器和生成器都不可重复遍历。
- 【易错点 3】生成器不是序列,不支持索引。