斐波那契数列0,1,1,2,3,5,8,13,21,34….前两个数相加,是第三个数的值假如我需要一亿甚至十亿个数,如果使用range()生成,使用一个list()储存。我们使用迭代器设置好生成的方法,什么使用我们什么时候生成,这样可以节约内存斐波那契数列案例需要一个列表存储生成的数字maxCount=100000#需要生成的个数count=0#记录生成的次数startOne=0#斐波那契数列第一个起始值startTwo=1#斐波那契数列第二个起始值fibonacciList=list()whilecount<maxCount:fibonacciList.append(startOne)startOne,startTwo=startTwo,startOne+startTwocount+=1fornuminfibonacciList:print(num)加入迭代器这个过程没有一个列表classFibonacci(object):def__init__(self,allNum):self.allNum=allNum#需要生成的个数self.count=0#记录生成的次数self.startOne=0#斐波那契数列第一个起始值self.startTwo=1#斐波那契数列第二个起始值def__iter__(self):returnselfdef__next__(self):ifself.count<self.allNum:#记录斐波那契数fiboNum=self.startOne#计算斐波那契数self.startOne,self.startTwo=self.startTwo,self.startOne+self.startTwo#生成次数self.count+=1returnfiboNumelse:#自定义一个异常停止循环raiseStopIteration#传入生成个数fibo=Fibonacci(10000)#一个对象可以使用for循环fornuminfibo:print(num)Python迭代器原理简述
迭代器迭代器就是可以使用for循环的对象,list、str、tuple….那怎样才能实现这样的迭代?nums=[12,13,14]strs="python"tuples=(1,2,3,4,5)fornuminnums:print(num)一个对象可迭代的条件需要这个对象有__iter__()方法classClassmate(object):#有了这个方法该类就是可迭代的def__iter__(self):pass添加一个列表和添加方法给Classmate类classClassmate(object):def__init__(self):#存储self.namesList=list()defadd(self,other):#添加到列表里self.namesList.append(other)#有了这个方法该类就是可迭代的def__iter__(self):pass迭代器一个对象有__iter__()和__next__()方法叫迭代器如果使该对象可以返回迭代的数据:就需要一个迭代器的__next__()方法定义一个迭代器类classClassIterator(object):def__iter__(self):passdef__next__(self):pass完善一个可以执行的迭代器迭代对象的__iter__()方法需要返回一个迭代器对象#可迭代对象classClassmate(object):def__init__(self):self.namesList=list()defadd(self,other):self.namesList.append(other)#有了这个方法该类就是可迭代的def__iter__(self):#需要反对一个迭代器对象#把self传给迭代器,使迭代器可以获取self.namesListreturnClassIterator(self)#迭代器对象classClassIterator(object):def__init__(self,obj):self.nameList=obj.namesList#记录循环的次数self.count=0def__iter__(self):passdef__next__(self):ifself.count<len(self.nameList):name=self.nameList[self.count]self.count+=1returnnameelse:#自定义一个异常停止循环raiseStopIteration#主函数classmate=Classmate()#实例化对象classmate.add("小小")classmate.add("大大")classmate.add("中中")#for循环对象fornameinclassmate:print(name)把迭代对象类和迭代器类合并迭代对象和迭代器是两个类,那是否可以合并classClassmate(object):def__init__(self):self.namesList=list()self.count=0defadd(self,other):self.namesList.append(other)#有了这个方法该类就是可迭代的def__iter__(self):#需要反对一个迭代器对象#把列表传给迭代器returnselfdef__next__(self):ifself.count<len(self.namesList):name=self.namesList[self.count]self.count+=1returnnameelse:#自定义一个异常停止循环raiseStopIteration