Python知识巩固(迭代器)
迭代器
- from collections import Iterable
isinstance(a,Iterable) 可以用来判断是否是可以迭代的对象
iter() 放可以迭代的对象,它的返回值是一个迭代器
from collections import Iterator
isinstance(a,Iterator) 可以用来判断是否是迭代器
next() 放迭代器 - 结合程序
from collections.abc import Iterable,Iterator class Classmate(object): def __init__(self): self.names = list() def add(self,name): self.names.append(name) def __iter__(self): """如果想要一个对象称之为一个 可以迭代的对象, 既可以适用for,那必须实现__iter__方法 """ return ClassIterator(self) # 返回一个具有__iter__,__next__方法的对象的引用 # 因为ClassIterator需要列表names # 就把自己这个对象传给ClassIterator class ClassIterator(object): def __init__(self,obj): self.obj = obj self.num = 0 def __iter__(self): pass def __next__(self): if self.num < len(self.obj.names): r = self.obj.names[self.num] self.num += 1 return r else: raise StopIteration classmate = Classmate() classmate.add("老王") classmate.add("老张") classmate.add("老李") """ print("判断classmate是否是可以迭代的对象:",isinstance(clasasmate,Iterable)) classmate_iterator = iter(Classmate) #会自动调用Classmate的__iter__方法, # classmate_iterator就变成了ClassIterator对象 print("判断classmate_iterator是否是迭代器:",isinstance(clasasmate_iterator,Iterable)) print(next(classmate_iterator)) #会自动调用ClassIterator的__next__方法 """ for i in classmate: print(i)
- 既然如此,就可以把自己当成ClassIterator,最后应该变成这样
from collections.abc import Iterable,Iterator class Classmate(object): def __init__(self): self.names = list() self.num = 0 def add(self,name): self.names.append(name) def __iter__(self): return self def __next__(self): if self.num < len(self.names): r = self.names[self.num] self.num += 1 return r else: raise StopIteration classmate = Classmate() classmate.add("老王") classmate.add("老张") classmate.add("老李") for i in classmate: print(i)
- 迭代器的应用————斐波那契数列