在 Python 中,理解和区分生成器(generators)和迭代器(iterators)是非常重要的,因为它们都与迭代(iteration)有关,但它们的工作方式和用途有所不同。

迭代器(Iterators)

迭代器是实现了 __iter__()__next__() 方法的对象。迭代器对象知道如何返回序列中的下一个值,直到没有更多的值可以返回,此时会引发 StopIteration 异常。
迭代器的特点:

  • 可以使用 next() 函数来获取下一个值。

  • 只能向前迭代,不能后退。

  • 只能迭代一次,迭代完成后就无法再次迭代。
    以下是一个简单的迭代器示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class MyIterator:
    def __init__(self, n):
    self.n = n
    self.current = 0
    def __iter__(self):
    return self
    def __next__(self):
    if self.current < self.n:
    value = self.current
    self.current += 1
    return value
    else:
    raise StopIteration
    # 使用迭代器
    my_iterator = MyIterator(5)
    for value in my_iterator:
    print(value)

    生成器(Generators)

    生成器是一种特殊类型的迭代器,它不需要实现 __iter__()__next__() 方法。生成器使用 yield 关键字来产生值,而不是通过返回一个值来生成值。生成器在每次产生值后会暂停执行,并在下一次调用时从上次暂停的地方继续执行。
    生成器的特点:

  • 使用 yield 关键字定义,而不是 return

  • 生成器是懒惰的,它们只在需要时才计算值。

  • 可以使用 next() 函数或 for 循环来迭代。
    以下是一个简单的生成器函数示例:

    1
    2
    3
    4
    5
    6
    def my_generator(n):
    for i in range(n):
    yield i
    # 使用生成器
    for value in my_generator(5):
    print(value)

    生成器表达式

    生成器表达式是创建生成器的另一种简洁方式,类似于列表推导,但是使用圆括号 () 而不是方括号 []

    1
    2
    3
    gen_exp = (x * x for x in range(5))
    for value in gen_exp:
    print(value)

    生成器函数

    指的是一个函数,以yeid代替return,返回一个生成器对象。

    总结

  • 迭代器:实现了 __iter__()__next__() 方法的对象,可以用于迭代。

  • 生成器:一种特殊的迭代器,使用 yield 关键字定义,可以更高效地处理数据流。
    生成器特别适合于处理大量数据或需要按需生成数据的场景,因为它们不需要在内存中存储整个数据集。迭代器则是一个更通用的概念,适用于任何可以迭代的对象。