【Python程序开发系列】一文带你理解Python中的yield用法

这是我的第416篇原创文章。

一、引言

在 Python 中,yield 是一个关键字,用于定义生成器函数(generator function)。生成器是一种特殊的迭代器,可以逐个返回值,而不是一次性返回所有值。这使得生成器在处理大量数据时非常高效,因为它可以逐个生成值,而不是将所有值一次性加载到内存中。

如果不太好理解yield,可以先把yield当作return的同胞兄弟来看,他们都在函数中使用,并履行着返回某种结果的职责。

这两者的区别是:

return的函数直接返回所有结果,程序终止不再运行,并销毁局部变量;

而有yield的函数则返回一个可迭代的 generator(生成器)对象,你可以使用for循环或者调用next()方法遍历生成器对象来提取结果。

二、实现过程

2.1 高效读文件

当处理大型文件时,一次性将整个文件加载到内存中可能会导致内存不足。使用 yield,我们可以逐行读取文件,从而节省内存。

逐行读取文件:

def read_file_line_by_line(file_path):
    with open(file_path, 'r') as file:
        for line in file:
            yield line
for line in read_file_line_by_line('example.txt'):
    print(line, end='')

在上面的示例中,read_file_line_by_line 函数逐行读取文件,并将每一行作为迭代器返回。

2.2 轻松实现流式处理

流式处理是一种处理大量数据的方法,它允许数据在处理过程中逐个元素地流动。yield 可以帮助我们实现流式处理。

def process_data(data_stream):
    for data in data_stream:
        # 处理数据
        processed_data = data * 2
        yield processed_data
data_stream = [1, 2, 3, 4, 5]
processed_stream = process_data(data_stream)
for processed_data in processed_stream:
    print(processed_data)

输出:

2
4
6
8
10

在上面的示例中,process_data 函数是一个生成器,它逐个处理数据流中的元素,并将处理后的数据返回。

作者简介: 读研期间发表6篇SCI数据算法相关论文,目前在某研究院从事数据算法相关研究工作,结合自身科研实践经历持续分享关于Python、数据分析、特征工程、机器学习、深度学习、人工智能系列基础知识与案例。关注gzh:数据杂坛,获取数据和源码学习更多内容。