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

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

最佳答案

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

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

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

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

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

big_list = list(the_generator)

https://stackoverflow.com/questions/102535/

相关文章:

linux - Linux 内核中可能/不太可能的宏是如何工作的,它们有什么好处?

python - 为什么 PEP-8 指定最大行长度为 79 个字符?

python - 获取给定列的第一行值

c - Linux 中对 pthread_create 的 undefined reference

linux - 如何让 grep 打印每个匹配行下方和上方的行?

python - 如何在 Python 中实现 Softmax 函数

linux - 在 Linux 中使用 cURL 进行 HTTP POST 和 GET

linux - 如何在启动时运行 shell 脚本

python - 映射python字典中的值

linux - 如何获取后台进程的进程ID?