ITABAS
Python

Python - 迭代器和生成器区别(Iterator vs Generator)

下面简单说一下迭代器和生成器的区别: 通常生成器是通过调用一个或多个yield表达式构成的函数。每个生成器都是迭代器。 而迭代器是一个抽象的概念,包括了iterable和iterator这两种实现。

下面简单说一下迭代器和生成器的区别:

通常生成器是通过调用一个或多个yield表达式构成的函数。每个生成器都是迭代器。 而迭代器是一个抽象的概念,包括了iterableiterator这两种实现。

Iterator & Generator

  • iterable: 它表示了一个可以重复迭代的对象,判断一个对象是否可以iterable, 是否可以for循环, 是否定义了__getitem__方法, 是否定义了__iter__方法返回一个iterator
  • iterator: 特殊之处是只能迭代一次,判断一个对象是否是iterator,是否定义了__iter__方法,并且必须返回自身,是否定义了__next__方法

PS. strlist都是典型的iterable而不是iterator

用一个公交车的例子再来看一遍:

class Bus(object):   # 只是iterable而不是iterator

    def __init__(self, *args):
        self.stops = list(args)

    def __iter__(self):  # 并没有返回自身
        return BusStopIterator(self)

class BusStopIterator(object):  # iterator

    def __init__(self, bus):
        self.stops = bus.stops
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == len(self.stops):
            raise StopIteration
        stop = self.stops[self.index]
        self.index += 1
        return stop

if __name__ == '__main__':
    bus = Bus('XinZhuang RailWay Station', 'WaiHuan Road', 'LianHua Road', 'JinJiangLeYuan')
    for stop in bus:
        print(stop)
  • generator: 看如下表达式,两者是等价的。
def squares(length):
    for i in range(length):
        yield i*i

squares = [i**2 for i in range(10)]

yield实现斐波那契数列:

def fibonacci():
    a=b=1
    yield a
    yield b
    while True:
        a,b = b,a+b
        yield b