B、自定义迭代器
?Python中迭代器的本质上每次调用__next__()
方法都返回下一个元素或抛出StopIteration的容器对象
?由于Python中没有“迭代器”这个类,因此具有以下两个特性的类都可以称为“迭代器”类:
1、有__next__()
方法,返回容器的下一个元素或抛出StopIteration异常
2、有__iter__()
方法,返回迭代器本身
#斐波那契数列 class Fabs(): def __init__(self,max): self.max=max self.n,self.a,self.b=0,0,1 def __iter__(self):#定义__iter__方法 return self def __next__(self):#定义__next__方法 if self.n<self.max: tmp=self.b self.a,self.b=self.b,self.a+self.b #等价于: #t=(self.a,self.a+self.b) #self.a=t[0] #self.b=t[1] self.n+=1 return tmp raise StopIteration print(Fabs(5)) for item in Fabs(10): print(item,end=' ')
运行结果:
<__main__.Fabs object at 0x00000000023F9278>
1 1 2 3 5 8 13 21 34 55
三、迭代器的方法
1.iter.__next__():返回迭代器的下一个元素,但没有下一个元素时抛出StopIteration异常
list=[1,2,3,4] list=iter(list) print(list.__next__()) print(list.__next__()) print(list.__next__()) print(list.__next__()) print(list.__next__())
运行结果:
Traceback (most recent call last):
File "E:py3DemoHelloiterDemo.py", line 7, in <module>
print(list.__next__())
StopIteration
1
2
3
4
2.iter.__iter__():返回迭代器对象本身
list=[1,2,3,4] list=iter(list) print(list.__iter__())
运行结果:
<list_iterator object at 0x0000000001D6F208>