Python 中 yeild 的用法详解

 更新时间:2023年06月07日 08:13:01   作者:小马过河-2009  
yield 是 Python 中的关键字,用于生成器函数中,可以将函数变成一个迭代器,实现惰性计算,节省内存空间。本文将介绍 yield 的基本用法和实现原理,以及与 yield 相关的注意事项和常见问题。

1. yeild 介绍

yield 是 Python 的一个关键字,用于从一个函数中返回一个生成器(generator)。生成器是一种特殊类型的迭代器,它允许你延迟计算结果,这在处理大数据或者创建复杂数据结构时特别有用,因为你不需要一次性将所有的数据都存储在内存中。

一个使用 yield 的函数会被称为生成器函数。这种函数并不直接返回一个值,而是生成一系列的值。每次调用这个生成器函数,它会从上次离开的地方继续执行,并且可以产生许多结果,而不是单个值。

2. yeild 案例

以下是一个简单的使用 yield 的例子

def simple_generator():
yield 1
yield 2
yield 3


> 使用生成器
for num in simple_generator():
print(num)

输出:

1
2
3

在上面的例子中,simple_generator 是一个生成器函数,它生成了三个值:1, 2, 和 3。在 for 循环中,每次迭代都会从生成器中获取一个新的值。

可以想象,每当 yield 被调用时,函数会生成一个新的值,然后暂停执行。当下一个值被请求时(例如,在 for 循环中的下一次迭代),函数会从上次离开的地方恢复执行,再次运行到 yield 语句,然后再次暂停。

这就是 yield 的基本用法。它在处理大数据集或创建复杂的数据结构时特别有用,因为它允许你按需生成和处理数据,而不是一次性生成所有数据并一次性处理所有数据,这样可以大大节省内存。

3. 简单的例子对比yeild和常规函数

当然,让我们通过一个简单的例子来展示 yield 的用法,以及与常规函数返回一个完整列表的区别。

首先,让我们创建一个常规的函数,该函数将返回一个列表,其中包含从0到n的所有数字:

def create_numbers(n):
num_list = []
for i in range(n):
num_list.append(i)
return num_list


nums = create_numbers(5)
for num in nums:
print(num)

此函数将创建一个包含所有数字的列表,然后返回这个列表。如果 n 非常大,那么列表将占用大量内存。

现在,我们使用 yield 关键字改写这个函数,使其成为一个生成器:

def create_numbers(n):
for i in range(n):
yield i

nums = create_numbers(5)
for num in nums:
print(num)

在这个版本的函数中,我们并没有一次性创建一个完整的列表。相反,我们使用 yield 关键字,在每次迭代时生成下一个数字。这种方法对内存的利用更高效,因为我们并不需要在内存中一次性存储所有的数字。无论 n 多大,这个生成器在任何时候都只会产生一个数字。

当你需要处理大量数据时,这种方式特别有用。它允许你创建一个不会因数据量太大而耗尽内存的数据流。这也是生成器与常规函数的主要区别。

4. 复杂的例子说明yeild 与普通函数的差异

下面让我们使用一个更复杂的例子来说明 yield 和普通函数之间的差异。

假设我们要生成一个斐波那契数列,其中每个数字都是前两个数字的和。假设我们要生成前 N 个斐波那契数。

以下是使用普通函数生成斐波那契数列的方法:

def fibonacci(n):
nums = []
a, b = 0, 1
while len(nums) < n:
nums.append(b)
a, b = b, a + b
return nums

print(fibonacci(10)) # 输出: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

这个函数会一次性生成所有的斐波那契数,并将它们存储在一个列表中。这意味着所有的数都将同时存在于内存中。

现在,让我们尝试使用一个生成器来完成同样的任务:

def fibonacci(n):
yield 1
if n > 1:
a, b = 1, 1
while n > 1:
a, b = b, a + b
yield a
n -= 1

print(list(fibonacci(10))) # 输出: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

这个生成器会一次生成一个斐波那契数,每次你从生成器请求一个数时,它都会计算出新的数并返回。这意味着在任何时候,只有一个斐波那契数存在于内存中。

如果你要生成的斐波那契数非常多(例如,几百万个),那么生成器版本的函数将大大节省内存。此外,如果你只需要迭代而不需要所有的斐波那契数,那么使用生成器可以让你的代码更加高效。

yield 是 Python 中非常重要的关键字,可以将函数变成迭代器,实现惰性计算,节省内存空间。yield 的基本用法是在生成器函数中使用,通过 yield 关键字返回一个值,并暂停函数的执行,等待下一次调用。yield 的实现原理是通过生成器对象实现的,每次调用生成器对象的 next() 方法时,会执行生成器函数中的代码,直到遇到 yield 关键字。与 yield 相关的注意事项包括:生成器函数只能用于迭代器中,yield 只能在生成器函数中使用,yield 可以返回多个值,但只能接收一个值。常见问题包括:如何在生成器函数中使用 return 关键字,如何在生成器函数中使用异常处理,如何在生成器函数中使用多个 yield 关键字。

到此这篇关于Python 中 yeild 的用法详解的文章就介绍到这了,更多相关Python 中 yeild 的用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 8种常用的Python工具

    8种常用的Python工具

    这篇文章主要介绍了8种常用的Python工具,帮助大家更好的学习Python,感兴趣的朋友可以了解下
    2020-08-08
  • python 视频下载神器(you-get)的具体使用

    python 视频下载神器(you-get)的具体使用

    这篇文章主要介绍了python 视频下载神器(you-get)的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 基于PyQt5制作一个群发邮件工具

    基于PyQt5制作一个群发邮件工具

    这篇文章主要介绍了如何利用Python中的PyQt5模块,制作一个简易的邮件群发小工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-04-04
  • Python聊天室带界面实现的示例代码(tkinter,Mysql,Treading,socket)

    Python聊天室带界面实现的示例代码(tkinter,Mysql,Treading,socket)

    这篇文章主要介绍了Python聊天室带界面实现的示例代码(tkinter,Mysql,Treading,socket),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Python使用FastParquet库处理Parquet文件的方法

    Python使用FastParquet库处理Parquet文件的方法

    在大数据时代,数据存储和处理的效率至关重要,Parquet作为一种列式存储格式,因其高效的压缩和编码方案,成为大数据处理中的热门选择,本文将深入探讨FastParquet库的使用,帮助读者掌握如何利用这一工具高效处理Parquet文件,需要的朋友可以参考下
    2025-02-02
  • python中的np.argmax() 返回最大值索引号

    python中的np.argmax() 返回最大值索引号

    这篇文章主要介绍了python中的np.argmax() 返回最大值索引号操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)

    anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)

    这篇文章主要介绍了anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Django rest framework实现分页的示例

    Django rest framework实现分页的示例

    这篇文章主要介绍了Django rest framework实现分页的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Python写的英文字符大小写转换代码示例

    Python写的英文字符大小写转换代码示例

    这篇文章主要介绍了Python写的英文字符大小写转换代码示例,本文例子相对简单,本文直接给出代码实例,需要的朋友可以参考下
    2015-03-03
  • 关于对python中进程的几个概念理解

    关于对python中进程的几个概念理解

    进程由程序,数据和进程控制块组成,是正在执行的程,程序的一次执行过程,是资源调度的基本单位,下面这篇文章主要给大家介绍了关于对python中进程的几个概念理解,需要的朋友可以参考下
    2021-10-10

最新评论