代码点读机 / Python / yield

yield Python · 关键字

yield 让函数变成一个“生成器”,可以一次只给一个结果,给完暂停,下次继续从暂停的地方接着给,而不是一口气把所有结果都算出来返回。 就像在食堂打饭:你拿小碗打饭,阿姨舀一勺给你,你走了她也不追着给;吃完不够再来的时候,她再舀下一勺。这样不会一次把所有饭都堆你碗里,省内存,也灵活。

怎么用

yield 值

小例子

def 数到三():
    print("开始数数")
    yield 1          # 给一个 1,然后暂停
    print("继续数")
    yield 2          # 给一个 2,再暂停
    print("再继续")
    yield 3          # 给一个 3,结束

生成器 = 数到三()
print(next(生成器))   # 第一次调用,执行到第一个 yield
print(next(生成器))   # 从暂停处继续,执行到第二个 yield
print(next(生成器))   # 从暂停处继续,执行到第三个 yield

运行结果

开始数数
1
继续数
2
再继续
3

对比:用 return 会一次全部结束

def 数到三():
    return [1, 2, 3]   # 一次返回整个列表

for 数字 in 数到三():
    print(数字)

常见使用场景

1、处理大量数据时,不需要一次性全部加载到内存(比如读取超大文件、生成无限序列等)。
2、实现“惰性计算”,用到的时候才计算下一个值。
3、在异步编程中配合 async 使用,实现异步生成器。

提醒:使用 yield 的函数叫生成器函数,调用它不会执行函数体,而是返回一个生成器对象。 可以用 for 循环自动遍历生成器,不必手动 next()。 生成器只能遍历一次,取完就没了,不能像列表那样反复从头取。 如果函数里有 yield,它就不再是普通函数,不能用 return 返回普通值(除非 return 后面不跟值,用来终止生成器)。

官方文档:https://docs.python.org/zh-cn/3/reference/simple_stmts.html#yield

在代码里遇到不认识的词?打开代码点读机,点一下就懂 → ← Python全部词条