翼度科技»论坛 编程开发 python 查看内容

Python 中 yeild 的用法

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
本文包含以下四部分:

  • yeild 介绍
  • yeild 案例
  • 简单的例子对比yeild和常规函数
  • 复杂的例子说明yeild 与普通函数的差异
1. yeild 介绍

yield 是 Python 的一个关键字,用于从一个函数中返回一个生成器(generator)。生成器是一种特殊类型的迭代器,它允许你延迟计算结果,这在处理大数据或者创建复杂数据结构时特别有用,因为你不需要一次性将所有的数据都存储在内存中。
一个使用 yield 的函数会被称为生成器函数。这种函数并不直接返回一个值,而是生成一系列的值。每次调用这个生成器函数,它会从上次离开的地方继续执行,并且可以产生许多结果,而不是单个值。
2. yeild 案例

以下是一个简单的使用 yield 的例子
点击查看代码
  1. def simple_generator():
  2.     yield 1
  3.     yield 2
  4.     yield 3
  5. > 使用生成器
  6. for num in simple_generator():
  7.     print(num)
复制代码
输出:
点击查看代码
  1. 1
  2. 2
  3. 3
复制代码
在上面的例子中,simple_generator 是一个生成器函数,它生成了三个值:1, 2, 和 3。在 for 循环中,每次迭代都会从生成器中获取一个新的值。
可以想象,每当 yield 被调用时,函数会生成一个新的值,然后暂停执行。当下一个值被请求时(例如,在 for 循环中的下一次迭代),函数会从上次离开的地方恢复执行,再次运行到 yield 语句,然后再次暂停。
这就是 yield 的基本用法。它在处理大数据集或创建复杂的数据结构时特别有用,因为它允许你按需生成和处理数据,而不是一次性生成所有数据并一次性处理所有数据,这样可以大大节省内存。
3. 简单的例子对比yeild和常规函数

当然,让我们通过一个简单的例子来展示 yield 的用法,以及与常规函数返回一个完整列表的区别。
首先,让我们创建一个常规的函数,该函数将返回一个列表,其中包含从0到n的所有数字:
点击查看代码
  1. def create_numbers(n):
  2.     num_list = []
  3.     for i in range(n):
  4.         num_list.append(i)
  5.     return num_list
  6. nums = create_numbers(5)
  7. for num in nums:
  8.     print(num)
复制代码
此函数将创建一个包含所有数字的列表,然后返回这个列表。如果 n 非常大,那么列表将占用大量内存。
现在,我们使用 yield 关键字改写这个函数,使其成为一个生成器:
点击查看代码
  1. def create_numbers(n):
  2.     for i in range(n):
  3.         yield i
  4. nums = create_numbers(5)
  5. for num in nums:
  6.     print(num)
复制代码
在这个版本的函数中,我们并没有一次性创建一个完整的列表。相反,我们使用 yield 关键字,在每次迭代时生成下一个数字。这种方法对内存的利用更高效,因为我们并不需要在内存中一次性存储所有的数字。无论 n 多大,这个生成器在任何时候都只会产生一个数字。
当你需要处理大量数据时,这种方式特别有用。它允许你创建一个不会因数据量太大而耗尽内存的数据流。这也是生成器与常规函数的主要区别。
4. 复杂的例子说明yeild 与普通函数的差异

下面让我们使用一个更复杂的例子来说明 yield 和普通函数之间的差异。
假设我们要生成一个斐波那契数列,其中每个数字都是前两个数字的和。假设我们要生成前 N 个斐波那契数。
以下是使用普通函数生成斐波那契数列的方法:
点击查看代码
  1. def fibonacci(n):
  2.     nums = []
  3.     a, b = 0, 1
  4.     while len(nums) < n:
  5.         nums.append(b)
  6.         a, b = b, a + b
  7.     return nums
  8. print(fibonacci(10))  # 输出: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
复制代码
这个函数会一次性生成所有的斐波那契数,并将它们存储在一个列表中。这意味着所有的数都将同时存在于内存中。
现在,让我们尝试使用一个生成器来完成同样的任务:
点击查看代码
  1. def fibonacci(n):
  2.     yield 1
  3.     if n > 1:
  4.         a, b = 1, 1
  5.         while n > 1:
  6.             a, b = b, a + b
  7.             yield a
  8.             n -= 1
  9. print(list(fibonacci(10)))  # 输出: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
复制代码
这个生成器会一次生成一个斐波那契数,每次你从生成器请求一个数时,它都会计算出新的数并返回。这意味着在任何时候,只有一个斐波那契数存在于内存中。
如果你要生成的斐波那契数非常多(例如,几百万个),那么生成器版本的函数将大大节省内存。此外,如果你只需要迭代而不需要所有的斐波那契数,那么使用生成器可以让你的代码更加高效。

来源:https://www.cnblogs.com/cxqiang/p/17461141.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具