当前位置: 首页 > 面试题库 >

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

蒋高扬
2023-03-14
问题内容

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


问题答案:

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

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

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

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

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

big_list = list(the_generator)


 类似资料:
  • 问题内容: 我读过,可以使用COM / ActiveX自动执行Crystal Reports中的月度报告。我不太了解这是什么,甚至可以使用它来做什么。 我也使用Excel进行了大量工作,看起来您也使用COM / ActiveX与其进行交互。 有人可以解释它是如何工作的,也许可以提供一个简短的例子? 问题答案: 首先,您必须安装出色的pywin32模块。 它提供COM支持。您需要运行该实用程序。它位

  • 本文向大家介绍Python可以用来做什么,包括了Python可以用来做什么的使用技巧和注意事项,需要的朋友参考一下 Python技术可做web开发 很多人只了解Java、PHP可做web开发,但针对Python也可以做web开发却了解很少。很多人将会不清楚,Python实际上是和互联网技术一起长大的。做为动态性语言,而且具备高些的抽象层次的Python和Perl,迅速就被开发者们发觉更合适用以开发

  • 问题内容: 我想我了解Lisp宏及其在编译阶段的作用。 但是在Python中,您可以将一个函数传递给另一个函数 因此,我们在这里得到了懒惰的评估。我可以使用宏而不是使用函数作为一流对象怎么办? 问题答案: 首先,Lisp也具有一流的功能,因此您也可以问:“如果我已经具有一流的功能,为什么在Lisp中需要宏”。答案是一流的函数不允许您使用语法。 从表面上看,一流的函数允许您编写或,但不允许编写。尽管

  • 问题内容: 在python中,可以通过将yield关键字放在函数主体中来轻松定义迭代器函数,例如: 我如何定义不产生任何值的生成器函数(生成0个值),以下代码不起作用,因为python无法知道它应该是生成器而不是普通函数: 我可以做类似的事情 但这将是非常丑陋的。有什么好的方法可以实现空的迭代器功能? 问题答案: 您可以在生成器中使用一次;它会停止迭代而不会产生任何结果,因此提供了一种使函数超出范

  • 问题内容: 一位同事最近问我如何深度克隆Map,我意识到我可能从未使用过clone()方法,这让我感到担忧。 您发现需要在何处克隆对象的最常见情况是什么? 问题答案: 我假设您是用Java 指的。如果是,请告知它存在一些主要问题,并且在大多数情况下,建议不要使用它。请参阅Joshua Bloch撰写的“ Effective Java”中 的第11项,以获取完整答案。我相信您可以安全地在原始类型数组

  • 问题内容: 传统观点认为,您只能抛出在Java 中扩展的对象,但是是否可以禁用字节码验证程序并让Java编译并运行抛出任意对象(甚至是原语)的代码? 我查找了JVM ,它将弹出操作数堆栈中的第一个objref。但是会检查所述引用是否指向运行时? 问题答案: 这取决于您的JVM实现。根据Java VM规范,如果对象不是,则它是未定义的行为。 objectref 必须 是引用类型,并且必须引用Thro