💡
原文中文,约1500字,阅读约需4分钟。
📝
内容提要
迭代器是实现了__iter__和__next__方法的对象,而可迭代对象只需实现__iter__。生成器函数通过yield关键字生成元素,生成器表达式则是惰性版本的列表推导,返回生成器对象。
🎯
关键要点
- 实现了__iter__的方法是可迭代对象,实现了__iter__和__next__的方法是迭代器。
- 可迭代对象的抽象基类是abc.Iterable,迭代器的抽象基类是abc.Iterator。
- 定义__iter__方法返回带有__next__方法的对象,__iter__可以简单返回self。
- 当没有数据返回时,会抛出StopIteration异常停止返回数据。
- 生成器函数是包含yield关键字的函数,生成器函数创建生成器对象。
- 生成器对象在调用next(...)时,会执行下一个yield语句并返回值,暂停在当前位置。
- 生成器表达式是惰性版本的列表推导,按需生成元素,不会立即构建列表。
- 生成器表达式返回生成器对象,可以通过next或循环的方式惰性求值。
❓
延伸问答
什么是可迭代对象和迭代器的区别?
可迭代对象实现了__iter__方法,而迭代器则实现了__iter__和__next__方法。
如何实现一个自定义的迭代器?
定义一个类,包含__iter__方法返回self和__next__方法处理数据,遇到无数据时抛出StopIteration异常。
生成器函数的特点是什么?
生成器函数包含yield关键字,创建生成器对象,调用时会暂停并返回值,直到下次调用。
生成器表达式与列表推导有什么不同?
生成器表达式是惰性版本的列表推导,不会立即构建列表,而是按需生成元素。
如何使用生成器对象进行惰性求值?
可以通过next函数或循环的方式来获取生成器对象中的元素,按需生成。
在迭代器中如何处理没有数据的情况?
当没有数据返回时,迭代器会抛出StopIteration异常以停止迭代。
➡️