迭代器是⽤来帮助我们记录每次迭代访问到的位置,当我们对迭代器使⽤next()函数的时候,迭代器会向我们返回它所记录位置的下⼀个位置的数据。实际上,在使⽤next()函数的时候,调⽤的就是迭代器对象的 __next__ ⽅法(Python3中是对象的 __next__ ⽅法, Python2中是对象的next()⽅法)。所以,我们要想构造⼀个迭代器,就要实现它的 __next__ ⽅法。但这还不够,python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现 __iter__ ⽅法,⽽ __iter__ ⽅法要返回⼀个迭代器,迭代器⾃身正是⼀个迭代器,所以迭代器的 __iter__ ⽅法返回⾃身即可。
⼀个实现了 __iter__ ⽅法和 __next__ ⽅法的对象,就是迭代器。
class MyList(object): """⾃定义的⼀个可迭代对象""" def __init__(self): self.items = [] def add(self, val): self.items.append(val) def __iter__(self): myiterator = MyIterator(self) return myiterator |
class MyIterator(object): """⾃定义的供上⾯可迭代对象使⽤的⼀个迭代器""" def __init__(self, mylist): self.mylist = mylist # current⽤来记录当前访问到的位置 self.current = 0 def __next__(self): if self.current < len(self.mylist.items): item = self.mylist.items[self.current] self.current += 1 return item else: raise StopIteration def __iter__(self): return self if __name__ == '__main__': mylist = MyList() mylist.add(1) mylist.add(2) mylist.add(3) mylist.add(4) mylist.add(5) for num in mylist: print(num) |
如何判断⼀个对象是否是迭代器
可以使⽤ isinstance() 判断⼀个对象是否是 Iterator 对象:
In [56]: from collections import Iterator
In [57]: isinstance([], Iterator)
Out[57]: False
In [58]: isinstance(iter([]), Iterator)
Out[58]: True
In [59]: isinstance(iter("abc"), Iterator) Out[59]: True