温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python生成器原理是什么

发布时间:2026-09-24 23:00:54 来源:亿速云 阅读:100 作者:小樊 栏目:编程语言

Python 的生成器(Generator)本质上是一种惰性求值的可迭代对象,它的核心原理可以用一句话概括:

生成器通过“暂停—恢复”执行机制,在每次需要值时才计算并返回,而不是一次性生成所有结果。

下面从几个层次详细说明。


一、生成器是什么

生成器是 实现了迭代器协议的函数或表达式:

  • 使用 yield 的函数就是生成器函数
  • 调用生成器函数 不会立即执行函数体
  • 返回的是一个 生成器对象(generator object)
def gen():
    yield 1
    yield 2

g = gen()

此时 gen() 没有执行任何代码,g 只是一个生成器对象。


二、核心原理:yield 的“暂停与恢复”

1. 普通函数 vs 生成器函数

普通函数

def f():
    return 1
  • 调用 → 执行 → 返回 → 结束

生成器函数

def gen():
    yield 1
    yield 2
  • 调用 → 返回生成器对象
  • 每次 next():
    • 执行到 yield
    • 暂停并保存现场
    • 返回 yield 的值
  • 下次 next():
    • 从暂停处继续执行

2. 执行流程示意

def gen():
    print("start")
    yield 1
    print("middle")
    yield 2
    print("end")

g = gen()
next(g)  # start → 返回 1
next(g)  # middle → 返回 2
next(g)  # end → StopIteration

三、底层实现原理(关键点)

1. 生成器是“带状态的协程”

在 CPython 中:

  • 生成器对象保存了:
    • 当前执行位置(字节码指针)
    • 局部变量
    • 调用栈状态
  • yield 相当于:
    • 保存执行上下文
    • 返回一个值
    • 等待下一次唤醒

2. 生成器自动实现迭代器协议

生成器自动拥有:

__iter__()
__next__()

所以可以直接用于:

for x in gen():
    print(x)

四、生成器的内存优势

普通方式(一次性生成)

list(range(1000000))
  • 占用大量内存

生成器方式

(i for i in range(1000000))
  • 每次只生成一个值
  • 内存占用几乎恒定

✅ 生成器适用于:

  • 大数据流
  • 无限序列
  • 延迟计算

五、生成器表达式

g = (x * x for x in range(10))

等价于一个匿名生成器函数。


六、send / throw / close(进阶)

生成器不仅能“产出”,还能“接收”:

def gen():
    x = yield 1
    yield x

g = gen()
next(g)        # 1
g.send(10)     # x = 10 → 返回 10
  • send():恢复并传值
  • throw():抛出异常
  • close():关闭生成器

七、总结一句话

Python 生成器的原理是:基于 yield 的“暂停—恢复”执行机制,利用迭代器协议实现惰性计算,从而节省内存、提高执行效率。

如果你愿意,我也可以:

  • 用 字节码角度 解释
  • 对比 生成器 vs 迭代器
  • 讲 生成器在协程/async 中的作用
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手