python中yield关键字是做什么的_Python生成器yield关键字详解

裘德小鎮的故事
发布: 2025-09-11 22:12:01
原创
606人浏览过
yield关键字使函数成为生成器,可暂停执行并按需返回值。生成器是特殊的迭代器,无需手动实现__iter__和__next__,通过yield自动保存状态,相比传统迭代器更简洁、内存友好。调用next()时,生成器从上次yield处继续执行,适用于大文件读取、斐波那契数列、数据流处理等场景,提升效率与可读性。

python中yield关键字是做什么的_python生成器yield关键字详解

yield
登录后复制
关键字在Python中扮演着生成器的核心角色。它允许函数暂停执行并返回一个值,而保留其状态,以便稍后可以从停止的地方继续执行。这使得你能够创建按需生成值的序列,而不是一次性将所有值存储在内存中。

Python生成器

yield
登录后复制
关键字详解:

生成器是一种特殊的迭代器,它不会一次性生成所有值,而是根据需要逐个生成。

yield
登录后复制
关键字是实现生成器的关键。

什么是生成器?它与迭代器有什么区别

生成器本质上是一种特殊的迭代器。迭代器是一个对象,实现了

__iter__
登录后复制
__next__
登录后复制
方法,用于按顺序访问集合中的元素。生成器通过使用
yield
登录后复制
关键字来简化迭代器的创建过程。

立即学习Python免费学习笔记(深入)”;

主要区别在于:

  • 实现方式: 迭代器通常需要定义一个类,并手动实现
    __iter__
    登录后复制
    __next__
    登录后复制
    方法。生成器则可以通过一个包含
    yield
    登录后复制
    语句的函数来创建,更简洁。
  • 内存占用 迭代器和生成器都不会一次性加载所有数据到内存中,而是按需生成。但生成器在实现上更加轻量级,通常占用更少的内存。
  • 状态保持: 生成器函数在每次调用
    next()
    登录后复制
    时,会从上次
    yield
    登录后复制
    语句停止的地方继续执行,保留了函数的状态。

例如,以下是一个迭代器的例子:

class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        value = self.data[self.index]
        self.index += 1
        return value

my_list = [1, 2, 3]
my_iterator = MyIterator(my_list)
for item in my_iterator:
    print(item)
登录后复制

而以下是一个生成器的例子:

def my_generator(data):
    for item in data:
        yield item

my_list = [1, 2, 3]
my_generator_object = my_generator(my_list)
for item in my_generator_object:
    print(item)
登录后复制

可以看到,生成器的代码更简洁。

阿里云-虚拟数字人
阿里云-虚拟数字人

阿里云-虚拟数字人是什么? ...

阿里云-虚拟数字人 2
查看详情 阿里云-虚拟数字人

yield
登录后复制
关键字如何工作?深入理解生成器的执行流程

当一个函数包含

yield
登录后复制
关键字时,它就变成了一个生成器函数。调用生成器函数时,它不会立即执行函数体,而是返回一个生成器对象。

当对生成器对象调用

next()
登录后复制
方法时,生成器函数会开始执行,直到遇到
yield
登录后复制
语句。此时,函数会暂停执行,并将
yield
登录后复制
后面的值返回给调用者。同时,函数的状态会被保存下来。

下次调用

next()
登录后复制
方法时,函数会从上次暂停的地方继续执行,直到再次遇到
yield
登录后复制
语句。这个过程会一直重复,直到函数执行完毕,或者遇到
return
登录后复制
语句(此时会抛出
StopIteration
登录后复制
异常)。

例如:

def my_generator():
    print("First")
    yield 1
    print("Second")
    yield 2
    print("Third")

gen = my_generator()
print(next(gen)) # 输出: First, 1
print(next(gen)) # 输出: Second, 2
print(next(gen)) # 输出: Third, StopIteration
登录后复制

可以看到,每次调用

next()
登录后复制
,生成器函数都会执行到下一个
yield
登录后复制
语句,并返回一个值。

生成器的实际应用场景:如何利用
yield
登录后复制
优化代码?

生成器在处理大数据集、无限序列或需要按需生成数据的场景下非常有用。

  • 读取大型文件: 可以使用生成器逐行读取大型文件,避免一次性将整个文件加载到内存中。
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('large_file.txt'):
    print(line)
登录后复制
  • 生成斐波那契数列: 可以使用生成器无限生成斐波那契数列。
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

for num in fibonacci():
    if num > 100:
        break
    print(num)
登录后复制
  • 数据流处理: 可以将生成器用于数据流处理管道,每个生成器负责一个特定的数据处理步骤。
def data_source():
    for i in range(10):
        yield i

def square(data):
    for item in data:
        yield item * item

def cube(data):
    for item in data:
        yield item * item * item

data = data_source()
squared_data = square(data)
cubed_data = cube(squared_data)

for item in cubed_data:
    print(item)
登录后复制

生成器可以显著提高代码的可读性和效率,尤其是在处理大数据或需要延迟计算的场景下。记住,使用

yield
登录后复制
的关键在于理解它如何暂停和恢复函数的执行,以及如何利用它来创建按需生成数据的迭代器。

以上就是python中yield关键字是做什么的_Python生成器yield关键字详解的详细内容,更多请关注php中文网其它相关文章!

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号