Python关键字yield的使用场景及用法详解

 更新时间:2025年06月16日 09:28:51   作者:檀越@新空间  
在 Python 编程语言中,yield是一个至关重要的关键字,它用于定义生成器函数(generator function),yield的出现使得 Python 能够优雅地实现惰性计算(lazy evaluation),本文给大家详细介绍了Python中关键字yield的使用场景及用法,需要的朋友可以参考下

一、yield 的基本概念

在 Python 编程语言中,yield是一个至关重要的关键字,它用于定义生成器函数(generator function)。与普通函数使用return返回结果不同,生成器函数使用yield产生一个值,同时"冻结"函数的当前状态,使得下次调用时可以从冻结点继续执行。

yield的出现使得 Python 能够优雅地实现惰性计算(lazy evaluation),这种特性在处理大数据集或无限序列时尤为有用。传统函数在返回结果后会释放所有资源并忘记之前的执行状态,而生成器函数则能够记住它的状态,在需要时继续产生下一个值。

二、生成器函数与普通函数的区别

生成器函数与普通函数在定义上非常相似,唯一的区别在于前者使用yield而非return。但这种表面上的微小差异带来了行为上的巨大不同:

  • 执行流程:普通函数从开始执行到 return 语句后立即退出,而生成器函数在遇到 yield 时会暂停执行,保存所有局部变量状态,等待下一次调用。
  • 内存使用:普通函数需要一次性计算所有结果并存储在内存中,生成器则是按需生成值,大大节省内存空间。
  • 返回值:普通函数返回一个具体的值或对象,生成器函数返回一个生成器对象,这个对象遵循迭代器协议。

例如,比较以下两个函数:

# 普通函数
def squares(n):
    result = []
    for i in range(n):
        result.append(i*i)
    return result

# 生成器函数
def squares_gen(n):
    for i in range(n):
        yield i*i

第一个函数会一次性生成所有平方数并存储在列表中,而第二个函数则会在每次迭代时生成一个平方数,内存效率更高。

三、yield 的工作机制

理解yield的工作机制对于掌握生成器至关重要。当 Python 解释器遇到包含yield语句的函数时,它会将其特殊处理为一个生成器函数。调用生成器函数时,不会立即执行函数体,而是返回一个生成器对象。

生成器对象实现了迭代器协议,即包含__iter__()和__next__()方法。每次调用next()函数或在 for 循环中迭代时,生成器函数会从上次暂停的位置继续执行,直到遇到下一个yield语句,此时yield后的表达式值会被返回给调用者,函数状态再次被冻结。

当函数执行完毕(或遇到 return 语句)时,生成器会抛出StopIteration异常,表示迭代结束。这个异常通常被 for 循环等迭代上下文自动处理。

四、yield 的常见使用场景

  • 处理大型数据集:当需要处理的数据量太大而无法一次性装入内存时,生成器可以逐项产生数据,显著降低内存消耗。
def read_large_file(file_path):
    with open(file_path, 'r') as f:
        for line in f:
            yield line.strip()
  • 生成无限序列:生成器可以表示无限序列,如斐波那契数列、素数序列等,因为值是按需生成的。
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
  • 实现管道:多个生成器可以串联起来形成处理管道,每个生成器负责特定的处理步骤。
def filter_even(numbers):
    for n in numbers:
        if n % 2 == 0:
            yield n

def square(numbers):
    for n in numbers:
        yield n ** 2

# 使用管道
numbers = range(100)
result = square(filter_even(numbers))
  • 协程和状态保持:生成器可以用于实现简单的协程,保持函数状态并在不同时间点进行交互。

五、yield 的高级用法

除了基本用法外,yield还有一些更高级的应用:

  • yield from:Python 3.3 引入的yield from语法用于委托生成器,简化了生成器的嵌套使用。
def chain(*iterables):
    for it in iterables:
        yield from it
  • 生成器表达式:类似于列表推导式,但使用圆括号,返回一个生成器对象。
gen = (x*x for x in range(10))  # 生成器表达式
  • 双向通信:生成器可以通过send()方法接收数据,实现双向通信。
def accumulator():
    total = 0
    while True:
        value = yield total
        if value is None:
            break
        total += value

六、性能考量

使用生成器可以带来显著的性能优势,特别是在内存使用方面。由于生成器是惰性求值的,它们:

  • 减少内存占用,不需要预先存储所有结果
  • 可以立即开始产生第一个值,而不必等待所有计算完成
  • 适用于流式数据处理和实时系统

然而,生成器也有一些限制:

  • 生成器只能迭代一次,要重复使用需要重新创建生成器
  • 无法随机访问,只能顺序访问
  • 在某些情况下,如果所有数据确实需要同时存在,使用列表可能更直接

以上就是Python中关键字yield的使用场景及用法详解的详细内容,更多关于Python关键字yield的资料请关注脚本之家其它相关文章!

相关文章

  • 使用OpenCV对运动员的姿势进行检测功能实现

    使用OpenCV对运动员的姿势进行检测功能实现

    2022年奥林匹克运动会如期举行,以不正确的方式进行运动风险在增加,人体姿势估计是计算机视觉领域的重要问题,接下来通过本文给大家介绍下使用OpenCV对运动员的姿势进行检测功能,感兴趣的朋友一起看看吧
    2022-02-02
  • python实现矩阵的示例代码

    python实现矩阵的示例代码

    本文主要介绍了python实现矩阵的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 怎么使用python绘制3D瀑布图

    怎么使用python绘制3D瀑布图

    这篇文章主要介绍了怎么使用python绘制3D瀑布图的相关资料,瀑布图是由麦肯锡顾问公司所独创的图表类型,因为形似瀑布流水而称之为瀑布图(Waterfall Plot),文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • Python入门必须知道的11个知识点

    Python入门必须知道的11个知识点

    这篇文章主要为大家详细介绍了Python入门必须知道的11个知识点,帮助更好地了解python,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 点云地面点滤波(Cloth Simulation Filter, CSF)

    点云地面点滤波(Cloth Simulation Filter, CSF)

    这篇文章主要介绍了点云地面点滤波(Cloth Simulation Filter, CSF)“布料”滤波算法介绍,本文从基本思想到实现思路一步步给大家讲解的非常详细,需要的朋友可以参考下
    2021-08-08
  • Python实现Url地址截取的方法

    Python实现Url地址截取的方法

    在网络编程和数据处理过程中,解析 URL 并提取其各个部分是一个常见的需求,URL是用于定位互联网上资源的地址,本文将详细介绍如何使用 Python 编写一个函数,实现Url地址截取,需要的朋友可以参考下
    2025-03-03
  • 详解python编译器和解释器的区别

    详解python编译器和解释器的区别

    在本文中小编给读者们整理了关于python编译器和解释器的区别的知识点内容,有兴趣的朋友们跟着学习下。
    2019-06-06
  • Python脚本实现自动化处理Excel选择题

    Python脚本实现自动化处理Excel选择题

    本文介绍了一个自动整理选择题的Python脚本,可以将秒钟自动将杂乱的试题题题库整理成Excel表格格式,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2026-05-05
  • DjangoUeditor图片不显示img的src没有域名问题

    DjangoUeditor图片不显示img的src没有域名问题

    在使用DjangoUeditor过程中,可能遇到图片上传后不显示问题,解决办法是修改源码view.py,加入代码使得保存的图片URL带有协议和域名,具体做法是在保存图片代码中添加request.scheme获取协议,request.META['HTTP_HOST']获取域名
    2024-09-09
  • Python脚本实现DNSPod DNS动态解析域名

    Python脚本实现DNSPod DNS动态解析域名

    这篇文章主要介绍了Python脚本实现DNSPod DNS动态解析域名,本文直接给出实现代码,需要的朋友可以参考下
    2015-02-02

最新评论