迭代是重复反馈过程的活动,迭代器就是重复反馈过程活动的容器(python中为对象)。
迭代器从序列的第一个元素访问,中间不能后退直至所有元素被访问结束。
迭代器只有在迭代到某个元素时才计算该元素,在此之前的或之后的可以不存在或者被销毁。因此资源占比比较少。
>>> a=iter([1,2,3]) >>> a.__next__() 1 >>> a.__next__() 2 >>> a.__next__() 3 >>> a.__next__() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
自定义迭代器需实现__next__()和__iter__()方法。其中__next__()方法返回对象的下一个元素到最后抛出异常StopIteration;__iter__()方法返回迭代器本身self。
class TestIter(object): a, b, n = 1, 0, 0 def __init__(self, my_max): self.max = my_max def __iter__(self): return self def __next__(self): if self.n < self.max: tmp = self.a self.b, self.a = self.a, self.a + self.b self.n += 1 return tmp raise StopIteration print(TestIter(5)) for i in TestIter(10): print(i, end=' ')
在Python中,一边循环一边计算的机制,称为生成器。是不是很熟悉,我们可以认为生成器是一个返回迭代器的函数。
我们只需要将列表生成器的【】改为()就可以了
>>> list_1 = [x+1 for x in range(10)] >>> list_1 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> gen_1 = (x+1 for x in range(10)) >>> gen_1 <generator object <genexpr> at 0x000000000240BE40> >>> gen_1.__next__() 1 >>> gen_1.__next__() 2 >>> gen_1.__next__() 3 >>> gen_1.__next__() 4
>>> def fib(mymax): ... n,a,b = 0,0,1 ... while n < mymax: ... yield b ... a,b = b,a+b ... n += 1 ... >>> fib(5) <generator object fib at 0x000000000248E6D0> >>> for i in fib(10): ... print(i) ... 1 1 2 3 5 8 13 21 34 55
详情