您可以使用生成函数来做什么?

2022-03-16 00:00:00 python generator

问题描述

我开始学习Python,我遇到了生成器函数,其中包含Year语句。我想知道这些函数真正擅长解决哪些类型的问题。


解决方案

生成器为您提供延迟计算。您可以通过迭代来使用它们,显式地使用‘for’,或者隐式地将其传递给任何迭代的函数或构造。您可以将生成器视为返回多个项,就像它们返回一个列表一样,但不是一次返回所有项,而是逐个返回,生成器函数暂停,直到请求下一项。

生成器适用于计算大型结果集(特别是涉及循环本身的计算),在这些结果集中,您不知道是否需要所有结果,或者不想同时为所有结果分配内存。或者用于生成器使用另一个生成器或消耗某些其他资源的情况,如果发生得越晚越方便。

生成器的另一个用途(实际上是相同的)是用迭代替换回调。在某些情况下,您希望函数执行大量工作,偶尔向调用者报告。传统上,您会为此使用回调函数。您将此回调传递给功函数,它将定期调用此回调。生成器方法是,功函数(现在是生成器)对回调一无所知,只要它想要报告什么,它就会屈服。调用方不是编写单独的回调并将其传递给work-function,而是在生成器周围的一个小"for"循环中完成所有报告工作。

例如,假设您编写了一个"文件系统搜索"程序。您可以完整地执行搜索,收集结果,然后一次显示一个结果。在您显示第一个结果之前,必须收集所有结果,并且所有结果将同时存储在内存中。或者,您可以在找到结果的同时显示它们,这样内存效率更高,对用户也更友好。后者可以通过将结果打印函数传递给文件系统搜索函数来实现,也可以通过将搜索函数作为生成器并迭代结果来实现。

如果希望查看后两种方法的示例,请参阅os.path.walk()(带回调的旧文件系统遍历函数)和os.walk()(新的文件系统遍历生成器)。当然,如果您真的想收集列表中的所有结果,那么生成器方法转换为大列表方法很简单:

big_list = list(the_generator)

相关文章