Python进阶:一文读懂迭代器与生成器

184 阅读2分钟

一、什么是迭代器

迭代器是可以被用来逐一遍历集合中的元素的对象。简而言之,迭代器允许我们一项一项地访问数据,而无需了解数据结构的底层实现。

在Python中,任何实现了__iter__()__next__()方法的对象都可以成为迭代器。

  • __iter__()方法返回迭代器对象本身。
  • __next__()方法返回容器中的下一个元素,
  • 重复步骤2,直到抛出StopIteration异常,表示遍历结束。

举个例子,我们可以自己实现一个简单的迭代器:

class MyIterator:
    def __init__(self, start, end):
        self.current = start
        self.end = end

    def __iter__(self):
        return self  # 返回迭代器对象本身

    def __next__(self):
        if self.current >= self.end:
            raise StopIteration  # 如果没有更多元素,抛出异常
        self.current += 1
        return self.current - 1  # 返回当前元素


my_iter = MyIterator(1, 5)
for num in my_iter:
    print(num)

输出:

1
2
3
4

可以看到,for循环背后其实是通过不断调用迭代器的__next__()方法来遍历元素,直到抛出StopIteration为止。

二、什么是生成器

生成器是Python中一种更简洁、更高效的迭代器实现方式。与传统迭代器相比,生成器不需要显式定义类或__iter__()__next__()方法。它是通过yield关键字定义的一个函数。

  • yield语句用于生成一个值,并暂停函数的执行。下一次调用时,从暂停的地方继续执行,直到遇到下一个yield或者结束。

一个典型的生成器示例:

def my_generator(start, end):
    current = start
    while current < end:
        yield current  # 每次返回一个值并暂停
        current += 1

gen = my_generator(1, 5)
for num in gen:
    print(num)

输出:

1
2
3
4

你可以看到,生成器和迭代器的行为类似,唯一的不同是生成器通过yield来生成数据,而不是通过__next__()方法逐个返回。