小编典典

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

python

我开始学习Python,并且遇到过生成器函数,这些函数中包含yield语句。我想知道这些功能确实可以解决哪些类型的问题。


阅读 154

收藏
2020-12-20

共1个答案

小编典典

生成器为您提供懒惰的评估。您可以通过遍历它们来使用它们,可以显式地使用“
for”,也可以隐式地将其传递给任何迭代的函数或构造。您可以将生成器视为返回多个项目,就像它们返回一个列表一样,但是与其一次一次返回它们而不是一次全部返回它们,而是将生成器功能暂停直到请求下一个项目。

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

生成器的另一个用途(实际上是相同的)是将迭代替换为迭代。在某些情况下,您希望某个函数执行大量工作,并偶尔向呼叫者报告。传统上,您将为此使用回调函数。您将此回调传递给工作函数,它将定期调用此回调。生成器方法是工作函数(现在是生成器)对回调一无所知,仅在需要报告某些内容时才产生。调用者没有编写单独的回调并将其传递给工作函数,而是在生成器周围的一个“
for”循环中完成所有报告工作。

例如,假设您编写了一个“文件系统搜索”程序。您可以完整地执行搜索,收集结果,然后一次显示一个。在显示第一个结果之前,必须先收集所有结果,并且所有结果将同时存储在内存中。或者,您可以在找到结果时显示结果,这样可以提高内存效率,并且对用户友好得多。后者可以通过将结果打印功能传递给文件系统搜索功能来完成,也可以仅通过使搜索功能为生成器并遍历结果来完成。

如果要查看后两种方法的示例,请参见os.path.walk()(带有回调的旧文件系统行走功能)和os.walk()(新的文件系统行走生成器。)当然,如果您确实想将所有结果收集到列表中,生成器方法可以轻松转换为大列表方法:

big_list = list(the_generator)
2020-12-20