迭代器
迭代(iterate)意味着重复多次,就像循环那样。本书前面只使用for循环迭代过序列和字典,但实际上也可迭代其他对象;实现了方法iter的对象。
方法iter返回一个迭代器,它是包含next的对象,而调用这个方法时可不提供任何参数。当你调用方法next时,迭代器应返回其下一个值。如果迭代器没有可供返回的值,应引发StopIteration异常。你还可以使用内置函数的便利函数next,在这种情况下,next(it)与it.next()等效。
斐波那契数列,表示该数列的迭代器如下:
class Fibs:
def __init__(self):
self.a = 0
self.b = 1
def __next__(self):
self.a,self.b = self.b, self.a + self.b
return sefl.a
def __iter__(self):
return self
首先,创建一个对象。
fibs = Fibs()
然后就在for循环中使用这个对象,如找出第一个大于1000的斐波那契数列。
for f in fibs:
if f > 1000:
print(f)
break
...
1597
这个循环之所以会停止,时因为其中包含break语句;否则,这个for循环将会没玩没了的执行。
提示 通过对可迭代对象调用内置函数iter,可获得一个迭代器。
>>>it = iter([1,2,3])
>>>next(it)
1
>>>next(it)
2
还可使用它从函数或其他可调用对象创建可迭代对象
生成器
生成器是一种使用普遍函数语法定义得迭代器。生成器得工作原理到底是什么呢?通过示列来说明最合适。
创建生成器
nested = [[1,2],[3,4],[5]]
def flatten(nested):
for sublist in sublist:
for element in sublist:
yield element
这个函数大部分代码都很简单。它首先迭代所提供嵌套列表中得所有子列表,然后按顺序迭代每个子列表的元素。倘若最后一行为print(element),这个函数将容易理解得多,不是吗?
在这里,你没有见过的是yield语句。包含yield语句的函数都被称生成器。这可不仅仅是值,而是可以生成多个值,每次一个。每次使用yield生成一个值后,函数都将冻结,即在此停止执行,等待被重新唤醒。被重新唤醒后,函数将从停止的地方开始执行。
为使用所有值,可对生成器进行迭代。
>>>nested = [[1,2],[3,4],[5]]
>>>for num in flatten(nested):
... print(umu)
...
1
2
3
4
5
或
>>>list(flatten(nested))
[1,2,3,4,5]