首页 >web前端 >js教程 >如何使用收益率关键字来控制发电机函数中的执行流?

如何使用收益率关键字来控制发电机函数中的执行流?

Robert Michael Kim
Robert Michael Kim原创
2025-03-12 16:33:15570浏览

如何使用yield关键字来控制发电机函数中的执行流?

yield关键字在函数中用于将其转换为发电机。生成器函数没有返回单个值并终止,而是在每个yield语句中暂停其执行,将值返回给呼叫者。保留了该函数的状态,使其可以在下次调用时恢复执行情况。这允许按需生成一系列值,而不是一次生成整个序列。

让我们用一个例子说明:

 <code class="python">def my_generator(n): for i in range(n): yield i*2 gen = my_generator(5) # Create a generator object for num in gen: print(num) # Output: 0, 2, 4, 6, 8</code>

在此示例中, my_generator不返回列表。取而代之的是,每个呼叫next(gen) (在for循环中进行隐式完成)执行该函数,直到遇到下一个yield语句为止。返回所产生的值,并保存函数的状态。 next(gen)的下一个呼叫从上次yield后的点开始。当功能完成执行时,发电机将终止,而不会遇到其他yield

将发电机带有yield关键字而不是返回列表的优点是什么?

使用具有yield的发电机提供了比返回列表的几个优点:

  • 内存效率:发电机一次产生一个值。当处理大型数据集时,这尤其有益,这些数据集无法舒适地作为列表中的记忆。列表需要同时将所有值存储在内存中,而生成器仅跟踪当前状态和要生成的下一个值。
  • 懒惰评估:生成器仅根据要求计算值。这比预先计算所有值并将其存储在列表中更有效,尤其是在不需要某些值的情况下。
  • 提高的可读性:为了生成序列,生成器通常会导致比创建和返回列表更清洁,更简洁的代码,尤其是对于复杂的序列。
  • 无限序列:发电机可以轻松地表示无限序列,这对于列表是不可能的。例如,您可以创建一个无限期产生质数的发电机。

简而言之,当您需要迭代地产生一个值的序列时,发电机是理想的选择,而无需立即存储整个序列的内存开销。

我可以将yield与其他控制流语句结合使用,例如if和发电机函数中的for

是的,您可以自由地使用其他控制流yield ,例如ifelifelsefor Generator函数中的while 。这允许创建复杂的条件序列。

这是一个if循环for示例:

 <code class="python">def even_numbers_generator(n): for i in range(n): if i % 2 == 0: yield i even_gen = even_numbers_generator(10) for num in even_gen: print(num) # Output: 0, 2, 4, 6, 8</code>

该发电机使用for循环进行迭代,而if条件可以过滤均匀的数字,仅产生指定范围内的偶数数字。

yield关键字与生成器函数上下文中的return关键字有何不同?

关键区别在于它们如何影响函数的执行:

  • yield暂停该函数的执行,返回值并保留函数的状态。可以从关闭的位置恢复该功能。
  • return完全终止函数的执行。该函数的状态丢失,无法生成其他值。发电机函数中的return语句信号表示序列的末尾。

从本质上讲, yield创建了迭代器,而return提供了最终结果并结束了过程。通常在发电机函数中使用return来发出序列末尾的信号,尽管除了产生值之外,还可以return值(尽管这不太常见)。使用return而不产生任何值只会创建常规功能,而不是生成器。

以上是如何使用收益率关键字来控制发电机函数中的执行流?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn