一. 迭代器Iterator
迭代器是访问可迭代对象的工具,使用 iter(可迭代对象) 返回的对象(实例)即迭代器,可以使用 next(迭代器) 获取可迭代对象的数据。关于迭代器的常用方法总结如下:
iter(iterable) | 从可迭代对象中返回一个迭代器 参数:iterable必须是一个可提供迭代器的对象(实现了__iter__方法) |
next(iterator) | 从迭代器iterator获取下一个记录,如果无法获取下一条记录,则触发StopIteration异常 |
使用迭代器遍历集合元素:iter函数返回一个迭代器,next函数依次访问迭代器中的记录,无法获取下一条记录时,触发StopIteration异常。
或者在while循环外侧捕获StopIteration异常:
二. 生成器Generator
生成器是指能够动态提供数据的对象,生成器对象也是可迭代对象,而且是一个迭代器。所谓动态提供数据,即要一个,给一个,而不是直接生成所有数据。因此与字典和集合(空间换时间)相反,生成器是典型的时间换空间的例子。生成器包含生成器函数和生成器表达式。
2.1 生成器函数
含有yield语句的函数即生成器函数,此函数被调用将返回一个生成器对象。yield语句的语法即:yield 表达式。当程序遇到yield语句将返回函数调用处,再次取值时,则返回yield的位置,继续向下执行。因此生成器函数能节约计算机内存,用时间换取了空间。
生成器函数的调用将返回一个生成器对象,生成器对象是可迭代对象:
生成器对象可以像迭代器一样,使用next函数:
生成器函数调用return会触发一个StopIteration异常:
2.2 生成器表达式
生成器表达式的语法形式:(表达式 for 变量 in 可迭代对象 if 真值表达式),其中 if 子句可以省略。生成器表达式即用推导式的形式生成一个生成器;
备注:上述例子中,由于next(gen)已经从成成器取过一个值了,再次遍历时,生成器从之前的退出状态继续运行,因此遍历的结果从4开始。
列表推导式与生成器表达式的比较:列表推导式生成一个全新的列表,和原列表没有任何联系。
生成器表达式依赖于另外一个可迭代对象
三. 迭代工具函数
Python提供了zip、enumerate作为迭代工具函数,用于生成“个性化”的可迭代对象。
3.1 zip(iter1, iter2, iter3, ...)
返回一个由元组组成的zip对象,元组中的元素分别由iter1,iter2可迭代对象中的元素构成(元组个数由最小的可迭代对象决定)。
zip函数可以作为创建字典的可迭代对象:
3.2 enumerate(iterable, start=0)
生成带索引的枚举对象,返回的迭代类型为索引-值对(index-value)对;
默认索引从0开始,也可用start指定: