小编典典

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

all

我开始学习 Python 并且遇到了生成器函数,它们中有一个 yield 语句。我想知道这些函数真正擅长解决哪些类型的问题。


阅读 76

收藏
2022-06-07

共1个答案

小编典典

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

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

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

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

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

big_list = list(the_generator)
2022-06-07