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全部词条