python 中的生成器和迭代器

迭代器

定义

迭代器是实现了__iter__()__next__()方法的对象。它允许用户逐个访问集合中的元素,而不需要知道集合的底层结构。

工作原理

  • __iter__():返回迭代器对象自身。
  • __next__():返回集合中的下一个元素。如果没有更多元素可供返回,则抛出StopIteration异常。

示例

 1class MyIterator:
 2    def __init__(self, data):
 3        self.data = data
 4        self.index = 0
 5
 6    def __iter__(self):
 7        return self
 8
 9    def __next__(self):
10        if self.index < len(self.data):
11            result = self.data[self.index]
12            self.index += 1
13            return result
14        else:
15            raise StopIteration
16
17# 使用迭代器
18my_iter = MyIterator([1, 2, 3])
19for item in my_iter:
20    print(item)  # 输出: 1 2 3

生成器

定义

生成器是使用yield关键字定义的特殊类型的迭代器。与普通函数不同,生成器函数在执行时会暂停,并在下一次调用时继续执行。

工作原理

  • 当调用生成器函数时,它返回一个生成器对象,而不是立即执行函数体。
  • 每次调用next()时,生成器函数会从上次暂停的地方继续执行,直到遇到下一个yield语句。
  • yield语句会返回一个值并暂停函数的执行状态。

示例

1def my_generator():
2    yield 1
3    yield 2
4    yield 3
5
6# 使用生成器
7gen = my_generator()
8for item in gen:
9    print(item)  # 输出: 1 2 3

生成器表达式

生成器表达式是一种更简洁的生成器创建方式,类似于列表推导式,但使用圆括号:

1gen_exp = (x * x for x in range(5))
2for item in gen_exp:
3    print(item)  # 输出: 0 1 4 9 16

迭代器与生成器的比较

  • 内存使用:生成器在需要时逐个生成值,因而更节省内存;而迭代器通常需要在内存中存储整个数据集
  • 性能:生成器可以按需计算,避免一次性计算所有元素,从而提高性能,特别是在处理大型数据集时。
  • 语法:生成器使用yield关键字,语法更简洁,且可以轻松实现复杂的迭代逻辑。