Python yield 最通俗、最实用的讲解
yield是 Python 中一个非常强大的关键字它用于创建生成器Generator。理解yield对于编写高效、节省内存的迭代代码至关重要。一句话记住yield 让函数变成 “生成器”可以暂停执行、分段返回数据不占满内存。你可以把它理解成可以暂停 / 继续的 return。yield 是 Python 的关键字用于创建生成器Generator 核心特性 1. **暂停执行** - 函数执行到 yield 时暂停返回值给调用者 2. **恢复执行** - 下次调用时从 yield 之后继续执行 3. **状态保持** - 函数的局部变量和执行状态都会被保留 4. **惰性计算** - 按需生成值节省内存 yield vs return - return: 函数执行结束返回一个值函数退出 - yield: 函数暂停返回一个值函数可以继续执行1.最直观对比return vs yield1.1. return普通函数运行 → 返回结果 →直接结束一次性返回所有数据数据多了占内存def func(): return 1 return 2 # 永远不会执行1.2. yield生成器函数运行 → 遇到 yield →暂停返回值下次调用 →从暂停处继续执行可以多次返回不占内存def gen(): yield 1 # 暂停返回1 yield 2 # 下次继续返回2 yield 31.3. yield 的工作原理惰性求值yield实现了惰性求值Lazy Evaluation只在需要时才计算下一个值。2. yield 最核心 4 大用途实战必用2.1. 处理超大数据 / 无限数据不爆内存这是 yield最重要的用途比如你要生成 1 亿个数用 list 会直接卡死内存装不下用 yield 几乎不占内存# 生成器一次只生成一个数用完再生成下一个 def count(): n 0 while True: yield n n 1适用场景读取超大文件、爬取无限分页数据、处理千万级日志。2.2. 分段执行前后置代码就是你刚才学的pytest fixturehttps://blog.csdn.net/Kingairy/article/details/161514387pytest.fixture def open_browser(): print(打开浏览器) # 前置 yield driver # 暂停返回给测试用例 print(关闭浏览器) # 用例跑完后执行后置yield 在这里的作用先执行前面代码暂停把值给测试用例用例结束后自动执行后面的清理代码2.3. 协程 / 异步任务高级yield可以让函数暂停执行去做别的事再回来继续。 这是 Python 异步编程的基础。2.4. 流式处理数据管道模式# 读超大文件一次只读一行不占内存 def read_large_file(file): with open(file) as f: for line in f: yield line2.5. 无限序列def infinite_sequence(): 生成无限序列 num 0 while True: yield num num 1 # 使用 for i in infinite_sequence(): if i 100: break print(i)3.yield 的高级特性3.1. send() - 向生成器发送值def gen(): # 重点yield 左边可以接收 send 进来的值 value yield 开始 print(生成器收到, value) value2 yield 第二步 print(生成器又收到, value2) yield 结束 # 创建生成器 g gen() # 第一次必须 next() 或 send(None) print(next(g)) # 输出开始 # 往生成器里传数据 print(g.send(我是数据1)) # 输出第二步 print(g.send(我是数据2)) # 输出结束3.2. throw() - 向生成器抛出异常def generator(): try: yield 1 yield 2 except ValueError: yield 处理异常 yield 3 gen generator() print(next(gen)) # 1 print(gen.throw(ValueError)) # 处理异常 print(next(gen)) # 33.3. close() - 关闭生成器def generator(): try: yield 1 yield 2 finally: print(生成器被关闭) gen generator() print(next(gen)) # 1 gen.close() # 生成器被关闭3.4. yield from - 委托生成器def sub_generator(): yield 1 yield 2 yield 3 def main_generator(): # 使用 yield from 委托给子生成器 yield from sub_generator() yield 4 yield 5 for value in main_generator(): print(value) # 1, 2, 3, 4, 54.超简记忆口诀return返回结束一次性占内存yield暂停继续多次返回不占内存** pytest 里 **用来做前后置setup/teardown总结yield 让函数变成生成器支持暂停 / 继续最大优势处理大数据不爆内存你现在最常用pytest fixture 做前后置准备 清理本质分段执行函数