定义
- 迭代器:是一个实现了迭代器协议(
__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
语句处,生成并返回一个值,直到没有更多数据可生成。