''' 迭代器 迭代是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 可迭代对象 我们已经知道可以对list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。 可以使用 isinstance() 判断一个对象是否是 Iterable 对象: >>> from collections.abc import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('abc', Iterable) True >>> isinstance(mylist, Iterable) False >>> isinstance(100, Iterable) False 简单来说,一个具备了__iter__方法的对象,就是一个可迭代对象。 class MyList(object): def __init__(self): self.container = [] def add(self, item): self.container.append(item) def __iter__(self): """返回一个迭代器""" # 我们暂时忽略如何构造一个迭代器对象 pass >>> mylist = MyList() >>> from collections import Iterable >>> isinstance(mylist, Iterable) True iter()函数与next()函数 list、tuple、str、set、dict都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。 然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。 iter()函数实际上就是调用了可迭代对象的__iter__方法。 >>> li = [11, 22, 33, 44, 55] >>> li_iter = iter(li) >>> next(li_iter) 11 >>> next(li_iter) 22 >>> next(li_iter) 33 >>> next(li_iter) 44 >>> next(li_iter) 55 >>> next(li_iter) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration ''' class MyList(): def __init__(self): self.items = [] def add(self, val): self.items.append(val) def __iter__(self): return MyIterator(self) class MyIterator(object): '''自定义供MyList使用的一个迭代器''' def __init__(self, mylist): self.list = mylist self.current = 0 def __next__(self): if self.current < len(self.list.items): item = self.list.items[self.current] self.current += 1 return item else: raise StopIteration def __iter__(self): return self class FibIterator(object): '''斐波那契数列迭代器''' def __init__(self, n: int): ''' :param n: int, 生成数列的前n个数 ''' self.n = n self.current = 0 # 保存前前一个数,初始值为数列中的第一个数0 self.num1 = 0 # 保存前一个数,初始值为数列中的第二个数1 self.num2 = 1 def __next__(self): """被next()函数调用来获取下一个数""" if self.current < self.n: num = self.num1 self.num1, self.num2 = self.num2, self.num1 + self.num2 self.current += 1 return num else: raise StopIteration def __iter__(self): """迭代器的__iter__返回自身即可""" return self if __name__ == '__main__': # list = MyList() # list.add(1) # list.add(2) # list.add(3) # list.add(4) # list.add(5) # for n in list: # print(n) fib = FibIterator(n=10) for n in fib: print(n) l = list(FibIterator(n=20)) print(l) tp = tuple(FibIterator(n=15)) print(tp)
评论
评论功能已经关闭!