我开始学习Python,并且遇到了生成器函数,这些函数中包含yield 语句。我想知道这些函数真正擅长解决什么类型的问题。
生成器为您提供惰性评估。您可以通过迭代来使用它们,可以显式地使用“for”,也可以通过将其传递给任何迭代的函数或构造来隐式地进行迭代。您可以将生成器视为返回多个项目,就好像它们返回一个列表一样,但不是一次返回所有项目,而是逐个返回它们,并且生成器函数将暂停,直到请求下一个项目。
生成器非常适合计算大量结果(特别是涉及循环本身的计算),您不知道是否需要所有结果,或者您不想同时为所有结果分配内存。或者对于发电机使用的情况another生成器,或者消耗一些其他资源,如果尽可能晚发生的话会更方便。
生成器的另一个用途(实际上是相同的)是用迭代替换回调。在某些情况下,您希望函数执行大量工作并偶尔向调用者报告。传统上,您会为此使用回调函数。您将此回调传递给工作函数,它会定期调用此回调。生成器方法是工作函数(现在是生成器)对回调一无所知,并且只是在它想要报告某些内容时产生。调用者不是编写单独的回调并将其传递给工作函数,而是在生成器周围的一个小“for”循环中完成所有报告工作。
例如,假设您编写了一个“文件系统搜索”程序。您可以执行整个搜索,收集结果,然后一次显示一个结果。在显示第一个结果之前,必须收集所有结果,并且所有结果将同时存储在内存中。或者,您可以在找到结果时显示结果,这将提高内存效率,并且对用户更加友好。后者可以通过将结果打印函数传递给文件系统搜索函数来完成,或者可以通过仅使搜索函数成为生成器并迭代结果来完成。
如果您想查看后两种方法的示例,请参阅 os.path.walk() (带有回调的旧文件系统行走函数)和 os.walk() (新的文件系统行走生成器。)当然,如果如果您确实想收集列表中的所有结果,则生成器方法很容易转换为大列表方法:
big_list = list(the_generator)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)