购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.7 迭代器和生成器

当列表、元组、字典、集合中的元素很多时,如几百万、几亿甚至更多,这些元素一次性全放在内存里,它们将占据大量的内存资源,那么是否有更好、更高效的存储方式呢?迭代器和生成器就是为解决这一问题而提出的。使用迭代器和生成器,不会一次性把所有元素加载到内存,而是在需要的时候才生成返回结果。它们既可存储很多甚至无限多的数据,又不会占用太多资源。利用生成器或迭代器来存储数据的方式,在大数据处理、机器学习中经常使用。

前面介绍的序列、元组、字典及集合都是可迭代对象,可用在for、while等语句中。这些数据结构又称容器,在容器中使用iter()可得到迭代器,利用next()函数就可持续取值,直到取完为止。图5-1说明了可迭代对象、迭代器、生成器之间的关系。

图5-1 Python可迭代对象、迭代器和生成器之间的关系

(1)容器是一系列元素的集合,str、list、set、dict、file、sockets对象都可以看作容器,容器都可以被迭代(用在for、while等语句中),因此它们被称为可迭代对象。

(2)可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。

(3)迭代器持有一个内部状态的字段,用于记录下次迭代的返回值,它实现了__next__和__iter__方法,迭代器不会一次性把所有元素加载到内存,而是在需要的时候才生成返回结果。

(4)生成器是一种特殊的迭代器,它的返回值不是通过return得到的,而是通过yield得到的。

5.7.1 迭代器

用iter()函数可以把列表、元组、字典、集合等对象转换为迭代器。迭代器是Python最强大的功能之一,是访问集合元素的一种方式。迭代器可以记住遍历的位置的对象,迭代器对象使用next()函数,从集合的第一个元素开始访问,直到所有的元素被访问完为止。迭代器只能往前,不能后退。

1.定义一个列表

2.生成迭代器

对列表、元组、字典和集合使用iter()函数,即可将其转换为迭代器。

3.从迭代器中取元素

上面是用来进行异常处理的except,后续章节将介绍。其中使用next()从迭代器中取数,直到没有数据(即StopIteration)则触发break语句。

5.7.2 生成器

生成器可分为生成器函数和生成器表达式。生成器函数在第6章将介绍,这里主要介绍生成器表达式。生成器表达式是列表推导式的生成器版本,看起来像列表推导式,但是它返回的是一个生成器对象而不是列表对象。

生成器表达式与列表推导式相似,列表推导式是在中括号里,把中括号改为小括号则变成生成器。

或用next()函数从生成器中逐一取数据,与for循环取数效果一样。 UTBF8mqfUw5RKBFR1nl4Hz7gOLLtDbWuJBWSvnhvWYpTatZY/gRicJbpFo4FSI/+

点击中间区域
呼出菜单
上一章
目录
下一章
×