【一分钟快学】掌握 Python 生成器:使用 Yield 释放内存和性能的秘密武器

在 Python 中,yield 表达式是一种非常强大的特性,允许一个函数一次返回一个值,并在下一次调用时从上次返回的位置继续执行。这种函数称为生成器 。使用 yield 可以使代码更加内存高效,特别是当你需要迭代大量数据时。这是因为它不需要在迭代开始之前在内存中存储整个数据集。

如何使用 yield

基本用法

使用 yield 的函数会返回一个迭代器,每次迭代会返回一个值。

python 复制代码
def simple_generator():
    yield 1
    yield 2
    yield 3

# 使用生成器
for value in simple_generator():
    print(value)

使用场景

当处理大型数据集时,例如从文件逐行读取数据或从数据库逐行读取记录,使用 yield 可以极大地减少内存使用。

python 复制代码
def read_large_file(file_name):
    with open(file_name, 'r') as file:
        for line in file:
            yield line.strip()  # 去除换行符,逐行返回

# 逐行处理文件
for line in read_large_file('large_file.txt'):
    print(line)

注意点

  1. 状态保持 :生成器函数在每次 yield 后暂停执行,并在下一次迭代时从上次离开的地方继续执行。
  2. 只能遍历一次:生成器是一次性的,只能遍历一次。如果需要再次遍历,你需要重新创建生成器实例。
  3. 性能考虑 :虽然 yield 可以减少内存使用,但如果需要频繁访问数据或在多个地方使用数据,将所有数据加载到内存中可能更高效。
  4. 异常处理 :在生成器中处理异常需要注意,因为一旦生成器开始执行,它就会在 yield 处暂停,这可能会使异常处理变得复杂。

高级用法:生成器表达式

生成器表达式提供了一种更简洁的方式来创建生成器,类似于列表推导,但使用圆括号。

python 复制代码
# 生成器表达式
squares = (x*x for x in range(10))

for square in squares:
    print(square)

结合 yield 使用的 send() 方法

生成器不仅可以产出值,还可以通过 send() 方法接收外部传入的值,这为生成器与外界的交互提供了更大的灵活性。

python 复制代码
def counter():
    n = 0
    while True:
        received = yield n
        if received is not None:
            n = received
        else:
            n += 1

c = counter()
print(next(c))  # 输出 0
print(next(c))  # 输出 1
print(c.send(10))  # 输出 10

通过掌握 yield 的使用,你可以编写更加高效和灵活的 Python 代码,特别是在处理大数据集、流数据或需要协程的场景中。

相关推荐
ac-er888823 分钟前
如何在Flask中实现国际化和本地化
后端·python·flask
Adolf_199325 分钟前
Flask-WTF的使用
后端·python·flask
空城皆是旧梦26 分钟前
python爬虫初体验(一)
爬虫·python
藓类少女26 分钟前
正则表达式
数据库·python·mysql·正则表达式
深蓝海拓1 小时前
迭代器和生成器的学习笔记
笔记·python·学习
985小水博一枚呀2 小时前
【深度学习|可视化】如何以图形化的方式展示神经网络的结构、训练过程、模型的中间状态或模型决策的结果??
人工智能·python·深度学习·神经网络·机器学习·计算机视觉·cnn
CyreneSimon3 小时前
使用 LoRA 进行模型微调的步骤
python·transformer
ymchuangke3 小时前
数据清洗-缺失值处理-缺失值可视化图(竖线)
python·算法·数学建模
计算机学姐3 小时前
基于python+django+vue的旅游网站系统
开发语言·vue.js·python·mysql·django·旅游·web3.py
程序员小羊!4 小时前
Python语言基础教程(下)4.0
开发语言·python