了解一下Python中的yield

发布时间:2026/7/30 20:39:01

了解一下Python中的yield 在 Python 中yield是一个生成器generator关键字作用是把一个普通函数变成生成器函数并在执行过程中“暂停”函数把一个值返回给调用者下次调用时从暂停的位置继续执行。它主要用于惰性计算按需生成数据节省内存实现迭代器流式处理大量数据一、 yield 和 return 的区别1、return一次性返回函数结束deffunc():return1return2调用print(func())输出1函数执行到return后立即结束。2、yield返回一个值但暂停函数deffunc():yield1yield2yield3调用ffunc()print(f)输出generator object func at 0x...注意调用函数时代码并没有真正执行而是创建了一个生成器对象。二、使用 next() 获取 yield 的值deffunc():yield1yield2yield3gfunc()print(next(g))print(next(g))print(next(g))输出1 2 3执行过程第一次执行到 yield 1 ↓ 返回 1 ↓ 暂停第二次从 yield 1 后继续 ↓ 执行 yield 2 ↓ 返回 2 ↓ 暂停第三次继续执行 ↓ 返回 3第四次next(g)会StopIteration因为生成器已经结束。三、 yield 常用于 for 循环生成器天然支持迭代defnumbers():yield1yield2yield3forninnumbers():print(n)输出1 2 3实际上forninnumbers():内部不断调用next()四、 yield 的最大优势节省内存假设生成 1 亿个数字。普通列表nums[iforiinrange(100000000)]问题需要一次性创建所有数字占用大量内存生成器defnumbers():foriinrange(100000000):yieldi使用forninnumbers():print(n)特点用一个生成一个不保存全部数据内存占用极低这种思想叫惰性求值lazy evaluation五、 yield 的典型应用示例1读取大文件假设一个日志文件有几十 GB。不推荐withopen(log.txt)asf:dataf.readlines()因为一次性加载所有行 ↓ 内存爆炸推荐defread_file(filename):withopen(filename)asf:forlineinf:yieldlineforlineinread_file(log.txt):print(line)流程读取一行 ↓ yield 返回 ↓ 处理 ↓ 读取下一行示例2斐波那契数列不用 yielddeffib(n):result[]a,b0,1foriinrange(n):result.append(a)a,bb,abreturnresult需要保存整个列表。使用 yielddeffib(n):a,b0,1foriinrange(n):yielda a,bb,ab使用forxinfib(10):print(x)输出0 1 1 2 3 5 8 13 21 34六、yield 表达式高级用法yield不只是输出也可以接收数据。例如defconsumer():whileTrue:valueyieldprint(收到:,value)cconsumer()next(c)# 启动生成器c.send(hello)c.send(python)输出收到: hello 收到: python这里valueyield表示暂停等待外部通过send()传入数据七、 yield fromPython 3用于生成器嵌套。例如defsub():yield1yield2defmain():yieldfromsub()yield3forxinmain():print(x)输出1 2 3等价于defmain():forxinsub():yieldxyield3八、生成器和普通函数对比特性普通函数yield生成器返回方式returnyield执行时机调用立即执行next时执行返回次数一次多次是否保存状态否是内存占用较高较低适合场景普通计算大数据、流处理九、一个简单理解可以把yield想象成函数里的“暂停按钮”例如deftest():print(开始)yield1print(继续)yield2执行gtest()next(g)输出开始返回1再次next(g)输出继续返回2函数像视频播放一样开始播放 ↓ yield暂停 ↓ 继续播放 ↓ yield暂停总结yield的核心作用把函数变成生成器暂停函数执行并保存状态下次调用从暂停处继续按需产生数据减少内存占用最常见场景大文件读取大数据处理无限序列数据流Python 迭代器实现一句话记忆return 是“结束并返回”yield 是“返回一个值然后暂停等待下一次继续”。

相关新闻