python迭代器与生成器

python迭代器与生成器

💡 原文中文,约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异常以停止迭代。

➡️

继续阅读