迭代器
迭代器是一种支持next()
操作的对象。它包含一组元素,当执行next()
操作时,返回其中一个元素;当所有元素都被返回后,生成一个StopIteration
异常。
>>>a=[1,2,3] >>>ia=iter(a) >>>next(ia) 1 >>>next(ia) 2 >>>next(ia) 3 >>>next(ia) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
ite()
可以接受多种Python对象为参数,比如list,tuple, dict, set等,并将其转化为迭代器。迭代器可以用于for
语句或in
语句中。很多常用操作也是支持迭代器的,比如sum()
, max()
等。
>>> b=[4,5,6]
>>> ib=iter(b)
>>> for x in ib: ... print(x) ... 4 5 6 >>> ic=iter(b) >>> sum(ic) 15 >>> id=iter(b) >>> max(ic) 6
生成器
生成器是一种迭代器,是一种特殊的函数,使用yield
操作将函数构造成迭代器。普通的函数有一个入口,有一个返回值;当函数被调用时,从入口开始执行,结束时返回相应的返回值。生成器定义的函数,有多个入口和多个返回值;对生成器执行next()
操作,进行生成器的入口开始执行代码,yield
操作向调用者返回一个值,并将函数挂起;挂起时,函数执行的环境和参数被保存下来;对生成器执行另一个next()
操作时,参数从挂起状态被重新调用,进入上次挂起的执行环境继续下面的操作,到下一个yield
操作时重复上面的过程。Python的循环操作与C语言的实现不同,如果使用List等数据结构需要耗费大量的内容;循环操作中使用生成器只需要在内存中实例化一个对象,可以减少内存占用,提高循环操作的执行速度。
>>>def myG(): ... yield 1 ... yield 2 ... yield 3 ... >>>g=myG() >>>next(g) 1 >>>next(g) 2 >>>next(g) 3 >>>next(g) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>>g2=myG() >>>for i in g2: ... print(i) 1 2 3
生成器表达式
for...[if]...语句可以简洁的构建一个List,同时也可以用来构建生成器。
>>>a=[7,8,9] >>>b=[i**2 for i in a] >>>b [49, 64, 81] >>>ib=(i**2 for i in a) >>>ib <generator object <genexpr> at 0x7f72291217e0> >>>next(ib) 49 >>>next(ib) 64 >>>next(ib) 81 >>>next(ib) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration