MST

星途 面试题库

面试题:Python中迭代器与生成器的区别

请详细阐述Python中迭代器和生成器在定义、实现方式、内存使用及数据生成时机等方面的区别。
37.7万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

定义

  • 迭代器:是一个实现了迭代器协议(__iter____next__ 方法)的对象,可用于迭代访问集合中的元素。任何实现了这两个方法的对象都可被视为迭代器。
  • 生成器:是一种特殊的迭代器,它是通过函数定义的,但使用 yield 语句而不是 return 语句返回结果。生成器函数执行时会暂停,保留当前状态,下次调用时从暂停处继续执行。

实现方式

  • 迭代器:通过类来实现,在类中定义 __iter__ 方法返回迭代器对象自身(通常是 self),并定义 __next__ 方法来返回下一个元素。当没有更多元素时,__next__ 方法引发 StopIteration 异常。
class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        result = self.data[self.index]
        self.index += 1
        return result
  • 生成器:通过生成器函数来实现,生成器函数使用 yield 语句来生成值。每次调用 yield 时,函数的状态会被保存,下次调用时从上次 yield 的地方继续执行。
def my_generator(data):
    for item in data:
        yield item

内存使用

  • 迭代器:通常需要预先准备好所有的数据在内存中,因为迭代器只是对已存在的数据集合进行遍历。如果数据集非常大,可能会消耗大量内存。
  • 生成器:按需生成数据,只有在需要时才生成下一个值,而不是一次性生成所有数据。这使得生成器在处理大量数据时内存使用效率更高,因为同一时间内存中只需保存当前生成的数据。

数据生成时机

  • 迭代器:数据在迭代器创建之前就已经存在,迭代器只是按顺序访问这些已有的数据。
  • 生成器:数据是在迭代过程中按需生成的。每次调用 next() 方法(或使用 for 循环迭代)时,生成器函数执行到 yield 语句处,生成并返回一个值,直到没有更多数据可生成。