Python 的生成器

Posted on Tue, 30 Sep 2025 10:59:22 +0800 by LiangMingJian


概述

什么是生成器?为什么要有生成器?

众所周知,在 Python 中,列表作为一个容器可以存储多种多样的数据,它所占内存的大小与元素的个数成正比,元素越多,内存的占用也就越多。显然,在内存有限的情况下,列表的容量也是有限的。如果一次性创建一个巨大的列表,这会对程序的性能造成极大的影响。

一般情况下,我们并不会一次性处理所有的元素。因此,我们其实不必在创建列表时就把所有的元素加入,我们可以通过某种算法,在处理时再生成元素。这种边执行边生成的机制就称为生成器。

生成器是用时间换空间的典型实例,通过生成器的使用,我们可以节省内存的占用,这在大文件处理的时候是很有效的。

生成器的本质

生成器是迭代器的一种特殊实现方式,所有生成器都是迭代器,但并非所有迭代器都是生成器

在 Python 中通过 for in 对对象进行遍历的操作被称为迭代(Iteration),可以进行迭代操作的对象被称为可迭代(Iterable)对象。

在 Python 中,迭代器是指实现了 __iter__()(用以返回自身) 和 __next__() (用以返回下一个元素)方法的对象,生成器在构建时会自动生成 __iter__()__next__() 的方法。

迭代器特供惰性求值和单向遍历的特性

  • 迭代器的惰性求值可以让列表,元组,字典,集合这些可迭代对象在循环遍历时逐个访问,只有当程序调用 __next__() 方法时才继续访问。
  • 迭代器的单向遍历可以让元素在访问或使用后直接消耗,释放内存,因此迭代器的循环遍历是不可回溯,单向的。

迭代器可以通过对列表,元组等可迭代对象调用 iter() 方法来构建。

list1 = [0, 1, 2]  
iter1 = iter(list1)  
  
for each in iter1:  
    print(each)

生成器其实是迭代器的一种简写方式,它的功能与迭代器的功能基本一致,同时,它的实现比迭代器更为便捷,不需要向迭代器一样构建 __iter__()__next__() 方法,也不用调用 iter() 方法。

生成器的构建

在 Python 中,生成器的构建主要通过两种途径:生成器表达式与生成器函数。

生成器表达式

生成器表达式是特殊的推导表达式,只需将推导表达式的括号替换为小括号即可。

推导表达式的介绍可查看: Python 的推导表达式

generator1 = (x * 2 for x in range(3))  
print(next(generator1))  # 0
print(next(generator1))  # 2
print(next(generator1))  # 4
print(next(generator1))  # StopIteration

生成器函数

生成式函数是使用了关键字 yield 的函数。

yield 表达式类似 return,在函数执行到这里时会返回一个值,然后程序会记录代码执行位置,然后阻塞函数执行,直到程序调用 next() 后,然后从记录位置继续执行。

def generator(n):  
    while n < 10:  
        yield n  
        n += 1  
  
generator1 = generator(8)  
print(generator1)  # <generator object>
print(next(generator1))  # 8
print(next(generator1))  # 9
print(next(generator1))  # StopIteration