脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - Python中的Yield关键字,你了解多少?

Python中的Yield关键字,你了解多少?

2023-12-11 14:44涛哥聊Python Python

Yield的高级用法包括生成器的状态保存,允许无限递增或递减的生成器。还可以与条件结合使用,用于过滤生成的值,仅生成符合特定条件的值。最重要的是,yield支持懒惰计算,允许在需要时计算值,而不是一次性计算所有值,从

Python中的Yield关键字,你了解多少?

在Python中,yield是一个重要的关键字,它与生成器(Generator)和懒惰计算(Lazy Evaluation)密切相关。

yield允许函数在迭代过程中产生值,而不必一次性将所有值计算出来。这种特性在处理大数据集或无限序列时尤其有用。

一、yield关键字

1、yield的基本概念

yield是一个关键字,用于定义生成器函数。生成器函数可以被暂停和恢复,允许逐个生成值而不需要一次性计算所有值。当生成器函数执行到yield语句时,它将生成一个值,并保存其状态,然后等待下一次调用来继续执行。

2、生成器的工作原理

生成器是一种特殊类型的迭代器,由生成器函数创建。生成器函数包含至少一个yield语句,它可以返回一个值,并在下一次迭代时从yield语句处继续执行。这允许生成器函数的状态保持不变,而值可以逐个生成。

以下是一个简单的生成器函数示例:

def simple_generator():
    yield 1
    yield 2
    yield 3

gen = simple_generator()
print(next(gen))  # 输出:1
print(next(gen))  # 输出:2
print(next(gen))  # 输出:3

示例中,simple_generator是一个生成器函数,它包含三个yield语句。当我们创建生成器对象gen并调用next()函数时,生成器函数在每次调用后从yield语句处继续执行,并生成相应的值。

二、创建生成器

1、生成器函数

生成器函数是一种包含yield语句的函数,用于生成值。生成器函数的执行可以被多次暂停和继续,每次暂停都会生成一个值。

以下是一个生成器函数的示例,用于生成斐波那契数列:

def fibonacci_generator():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

gen = fibonacci_generator()
for _ in range(10):
    print(next(gen))  # 输出前10个斐波那契数

2、生成器表达式

除了生成器函数,Python还提供了生成器表达式,它类似于列表推导式,但是返回一个生成器对象,逐个生成值。生成器表达式的语法更紧凑。

以下是一个生成器表达式的示例,用于生成自然数的平方:

gen = (x**2 for x in range(1, 6))
for value in gen:
    print(value)  # 输出:1 4 9 16 25

生成器表达式可以在不创建额外的函数的情况下生成值,适用于简单的迭代需求。

三、yield的高级用法

1、生成器的状态保存

生成器函数在每次执行时都会保持其状态。这意味着它可以用于生成无限序列或大数据集,而不必将所有数据存储在内存中。

以下是一个无限递增的生成器示例:

def infinite_increment():
    num = 0
    while True:
        yield num
        num += 1

gen = infinite_increment()
for _ in range(5):
    print(next(gen))  # 输出:0 1 2 3 4

2、生成器的数据过滤

yield可以与条件结合使用,用于过滤生成的值。这允许生成器仅生成符合特定条件的值。

以下是一个示例,生成偶数的生成器:

def even_numbers():
    num = 0
    while True:
        if num % 2 == 0:
            yield num
        num += 1

gen = even_numbers()
for _ in range(5):
    print(next(gen))  # 输出:0 2 4 6 8

3、生成器的懒惰计算

生成器的懒惰计算是一种在需要时计算值的方式,而不是一次性计算所有值。这在处理大型数据集或无限序列时非常有用。

以下是一个示例,生成自然数的平方,但只计算前5个:

def lazy_square(limit):
    for x in range(1, limit + 1):
        yield x**2

gen = lazy_square(5)
for value in gen:
    print(value)  # 输出:1 4 9 16 25

懒惰计算允许在处理大量数据时节省内存和计算资源。

总结

yield的高级用法包括生成器的状态保存,允许无限递增或递减的生成器。还可以与条件结合使用,用于过滤生成的值,仅生成符合特定条件的值。最重要的是,yield支持懒惰计算,允许在需要时计算值,而不是一次性计算所有值,从而节省内存和计算资源。

在处理大型数据集、无限序列或需要逐个生成值的情况下,yield是一个强大的工具。通过深入理解yield,可以更好地利用生成器和懒惰计算,提高代码的效率和可维护性。

原文地址:https://www.toutiao.com/article/7292776802358559269/

延伸 · 阅读

精彩推荐
  • PythonPython入门基本操作列表排序用法详解

    Python入门基本操作列表排序用法详解

    本篇文中主要介绍列表的基本的组成,怎么访问列表、列表的切片、列表的排序、列表的添加、列表的删除等内容,有需要的朋友可以借鉴参考下,希望能...

    Python文泽老师11582022-01-03
  • PythonPython conda命令

    Python conda命令

    Windows下 Anaconda Prompt 这个东西就是用来管理Anaconda的,使用的是conda这样的一种命令 在Linux中,可以直接在终端中输入conda 命令 可以使用conda命令创建新的...

    Codeoooo9762023-08-18
  • PythonPython中property函数用法实例分析

    Python中property函数用法实例分析

    这篇文章主要介绍了Python中property函数用法,结合实例形式分析了property函数的功能、参数、使用方法及相关操作注意事项,需要的朋友可以参考下...

    有一种宿命叫无能为力11592021-02-28
  • Pythonpython使用pynput库操作、监控你的鼠标和键盘

    python使用pynput库操作、监控你的鼠标和键盘

    这篇文章主要介绍了python使用pynput库操作、监控你的鼠标和键盘,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...

    古明地盆12632021-09-18
  • Pythonpython负载均衡的简单实现方法

    python负载均衡的简单实现方法

    这篇文章给大家介绍用python实现最简单的负载均衡方法,即将请求发送到未宕机的服务器上,感兴趣的朋友一起看看吧...

    熔遁丶螺旋手里剑5072021-01-12
  • Python九个超级实用的数据科学Python库

    九个超级实用的数据科学Python库

    在本文中,我们会研究一些用于数据科学任务的 Python 库,而不是常见的比如 panda、scikit-learn 和 matplotlib 等的库。尽管像 panda 和 scikit-learn 这样的库,是在...

    数据STUDIO11862022-08-31
  • PythonPython处理json字符串转化为字典的简单实现

    Python处理json字符串转化为字典的简单实现

    下面小编就为大家带来一篇Python处理json字符串转化为字典的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看...

    脚本之家7052020-09-01
  • Python对python中Json与object转化的方法详解

    对python中Json与object转化的方法详解

    今天小编就为大家分享一篇对python中Json与object转化的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    欧程6222021-05-10