迭代器
-
用来表示一连串数据流的对象。重复调用迭代器的__next__() 方法(或将其传给内置函数next())将逐个返回流中的项、 当没有数据可用时,则会引发Stopiteration 异常。
-
迭代器必须有__iter__() 方法用来返回该迭代器的对象自身,因此迭代器必定也是可迭代对象,
-
使用内置函数iter()来创建迭代器对象
-
判断:iter 和__next__
#判断: a 可迭代,没有__next__方法,不是迭代器 >>> a [1, 2] >>> hasattr(a,'__iter__') True >>> hasattr(a,'__next__') False # 生成迭代器 >>> m=iter(a) #逐一读取,最后抛出StopIteration 异常 >>> m.__next__() 1 >>> m.__next__() 2 >>> m.__next__() Traceback (most recent call last): File "<pyshell#115>", line 1, in <module> m.__next__() StopIteration
斐波那切数列的迭代器:
class Fibs:
def __init__(self,max):
self.max=max
self.a=0
self.b=1
def __iter__(self):
return self
def __next__(self):
fib = self.a
if fib > self.max :
raise StopIteration
self.a,self.b=self.b,self.a+self.b
return fib
fibs=Fibs(10)
print (fibs.__next__())
lst=[i for i in fibs]
print (lst)
生成器
#生成器函数
>>> def test():
yield 1
yield 5
yield 10
>>> a=test()
>>> [i for i in a ]
[1, 5, 10]
斐波那切数列的生成器:
>>> def fibs():
a,b=0,1
while True :
yield a
a,b=b,a+b
>>> import itertools
>>> [ i for i in itertools.islice(fibs(),10)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]