python iterator

generator vs iterator

Every generator is an iterator, but not vice versa

itarator vs itarable

  • Iterable的iter方法会返回一个Iterator, Iterator的next方法(Python 2里是next)会返回下一个迭代对象,如果迭代结束则抛出StopIteration异常。

  • Iterator自己也是一种Iterable,所以也需要实现Iterable的接口,也就是iter,这样在for当中两者都可以使用。Iterator的iter只需要返回自己就行了。

generator class


class Fib:
    def __init__(self):
        self.a, self.b = 0, 1
    def __iter__(self):
        while True:
            yield self.a
            self.a, self.b = self.b, self.a+self.b

f = iter(Fib())
for i in range(3):
    print(next(f))


class Fib:
    def __init__(self):
        self.a, self.b = 0, 1        
    def __next__(self):
        return_value = self.a
        self.a, self.b = self.b, self.a+self.b
        return return_value
    def __iter__(self):
        return self

f = iter(Fib())
for i in range(3):
    print(next(f))