当前位置:首页 > Python > 正文

深入理解 Python 中的 yield 语句(小白也能掌握的生成器与迭代器教程)

Python 编程中,yield 是一个非常强大但初学者容易困惑的关键字。它用于定义 生成器函数(Generator Function),是实现 迭代器(Iterator) 的一种简洁方式。本教程将从零开始,用通俗易懂的语言带你彻底搞懂 yield 的工作原理和使用场景。

什么是 yield?

yield 语句的作用类似于 return,但它不会终止函数,而是“暂停”函数的执行,并在下次调用时从中断处继续。包含 yield 的函数被称为 生成器函数,调用它会返回一个 生成器对象(Generator Object),该对象是一个特殊的 迭代器

深入理解 Python 中的 yield 语句(小白也能掌握的生成器与迭代器教程)  生成器函数 迭代器 协程 第1张

简单示例:对比 return 和 yield

先看一个使用 return 的普通函数:

def normal_function():    return [1, 2, 3]result = normal_function()print(result)  # 输出: [1, 2, 3]

再看一个使用 yield 的生成器函数:

def generator_function():    yield 1    yield 2    yield 3result = generator_function()print(result)        # 输出: <generator object generator_function at 0x...>print(list(result))  # 输出: [1, 2, 3]

注意:调用生成器函数并不会立即执行函数体,而是返回一个生成器对象。只有在遍历(如用 for 循环或 list())时,函数才会逐次执行到每个 yield 并返回值。

yield 的执行流程详解

每次遇到 yield,函数会:

  1. 返回 yield 后面的值;
  2. 保存当前函数的状态(包括局部变量、执行位置等);
  3. 暂停执行,等待下一次被调用;
  4. 当下次被调用时,从上次 yield 的下一行继续执行。

来看一个带状态的例子:

def count_up_to(max):    count = 1    while count <= max:        yield count        count += 1# 使用生成器for num in count_up_to(5):    print(num)# 输出:# 1# 2# 3# 4# 5

为什么使用 yield?优势在哪?

使用 yield 创建生成器有以下显著优点:

  • 内存高效:不需要一次性将所有数据加载到内存中,适合处理大数据集或无限序列。
  • 惰性求值:只在需要时才计算下一个值,提升性能。
  • 代码简洁:相比手动实现迭代器类,使用 yield 更直观、更 Pythonic。

例如,读取大文件时,可以逐行生成内容而不占用大量内存:

def read_large_file(file_path):    with open(file_path, 'r') as f:        for line in f:            yield line.strip()# 使用for line in read_large_file('huge_log.txt'):    process(line)  # 逐行处理,不加载整个文件到内存

高级用法:send() 与协程

除了作为 迭代器,生成器还可用于实现简单的 协程(Coroutine)。通过 generator.send(value),我们可以向生成器传递数据。

def echo():    while True:        received = yield        print(f"收到: {received}")# 启动生成器g = echo()next(g)  # 必须先执行一次 next() 或 send(None) 来启动g.send("Hello")   # 输出: 收到: Hellog.send("World")   # 输出: 收到: World

这种能力使得生成器在异步编程、状态机等场景中非常有用。

总结

yieldPython 中实现 生成器函数 的核心关键字。它让函数具备“暂停-恢复”的能力,从而高效地生成一系列值。掌握 yield 不仅能写出更省内存的代码,还能为理解 迭代器协程 等高级概念打下基础。

记住这四个关键词:Python yield生成器函数迭代器协程。它们是你深入 Python 异步与高效编程的关键。

现在,试着自己写一个生成器吧!比如生成斐波那契数列,或者一个倒计时器。实践是最好的老师!