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

2024-01-06

我开始学习Python,并且遇到了生成器函数,这些函数中包含yield 语句。我想知道这些函数真正擅长解决什么类型的问题。


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

生成器非常适合计算大量结果(特别是涉及循环本身的计算),您不知道是否需要所有结果,或者您不想同时为所有结果分配内存。或者对于发电机使用的情况another生成器,或者消耗一些其他资源,如果尽可能晚发生的话会更方便。

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

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

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

big_list = list(the_generator)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成器函数可以用来做什么? 的相关文章

随机推荐

  • 具有动态数据的 SwiftUI 分层选取器

    我正在尝试在 SwiftUI XCode 11 3 1 中使用带有动态数据的多个选择器 该应用程序有时会崩溃 有时会冻结或在模拟器和运行 iOS 13 3 1 的真实设备上的选择器中显示错误的数据 我尝试了答案中的建议这个问题 https
  • Flutter ListView 双向延迟加载(向上、向下)

    我希望在 flutter 中有一个 ListView 它提供两个方向 向上 向下 的延迟加载 例子 后台数据库理论上可以显示60000条信息 首先我想显示项目 100 120 从这些索引中 我希望能够在延迟加载新项目时上下滚动 需要考虑的事
  • 模板类中模板方法的声明模板定义之外

    有谁知道模板类中声明外模板方法的语法 例如 template
  • 在 asp.net MVC 中对表进行排序

    我想知道人们如何在 ASP NET MVC 中对表进行排序 我听说过 javascript 解决方案可以很好地处理非分页表 例如 jquery 的表排序器 但我需要一个可以处理分页表的解决方案 我正在做的项目目前使用以下解决方案 但我发现它
  • Haskell 将 Float 转换为 Int

    我还是个新手 试图创建一个在函数中使用的列表 并希望使其尽可能小 恰好是 logBase x y 但我无法将 logBase 转换为我可以在此列表中使用的内容 1 logBase x y 有什么建议么 您没有发布您收到的类型错误 但我想它是
  • int24 - 24 位整数数据类型

    C 中有 24 位原始整型数据类型吗 如果没有 是否可以创建一个类 int24 uint24 其目的可能是 处理 24 位格式的声音文件 在没有 alpha 通道的情况下操作位图数据 根据要求 我将使用位字段 struct int24 un
  • 使用 Linux 帧缓冲区进行图形处理,但禁用控制台文本

    我有一些 C 代码 可以在 Linux 帧缓冲区控制台上绘制简单的图形 我还使用树莓派及其复合视频输出 操作系统是 raspbian 我正在做一个不使用 X 的低级解决方案 我的图形运行良好 而且我还能够读取 USB 键盘并对按键做出响应
  • artifact:install 推送 super-pom 而不是我定义的 POM

    我在 Ant 文件中定义了一个 POM 构建工作正常 从存储库中提取正确的工件 但是 工件 安装任务推送到 super pom 而不是我指定的 pom 我使用以下 POM 文件
  • Olive (Mono) 如何实现 (W)PF?

    在阅读一本维基百科上有关 Mono 的文章 http en wikipedia org wiki Mono 28software 29 我发现有一个 Mono 子 副项目叫做Olive http mono wikia com wiki Ol
  • 使用正则表达式解析多行日志条目

    我正在尝试使用以下正则表达式解析 C 应用程序中的日志条目 0 9 4 0 9 2 2 3 1 对于格式如下的日志 日期 某种格式 level 应用程序名称 信息 哪里 我认为 匹配行的开头 启用 gm在正则表达式101上 0 9 4 0
  • 提交 JTA 事务后可以回滚它吗?

    我有一个提交的 JTA 事务 提交后可以回滚吗 如果是 怎么办 我有以下情况 我有一个更新了 3 个 DB 的后端层 我已经使用了 JTA 用户交易 如果任何数据库中的更新失败 则使用 utx rollback 回滚对 3 个数据库的所有更
  • 如果用纯 C++ 表示静态?

    简而言之问题 怎样才能实现static if在 c 11 中提出的功能 用普通的 c 历史和原始问题 最近我遇到了这样一个问题 我需要上课Sender具有类似的界面 class Sender void sendMessage void se
  • 证明强可能素数的素性

    使用米勒 拉宾测试的概率版本 我生成了中大 200 300 位 可能素数的列表 但可能还不够好 我需要know这些数字是素数 是否有一个库 最好是用 Python 包装或可包装 可以实现更有效的素性证明算法之一 或者 有谁知道我在哪里可以找
  • 如何从 PDO 失败“错误!:SQLSTATE[HY093]:无效的参数号:参数未定义”中获取更多信息?

    每隔一段时间 我就会在 PDO 中遇到如下错误 错误 SQLSTATE HY093 参数号无效 参数未定义 有没有办法获得更具体的错误 例如行号 文件名 缺少的参数等 而不是模糊的消息 首先 确保 PDO 设置为在错误时抛出异常 pdo g
  • 如何从另一个平面/简单配置单元表加载带有map[structs]的配置单元表

    我在 hive 中有 2 个表 其中有 Order 和 Order Detail 具有 1 n 关系并在 order id 上连接 我试图利用 hive 复杂数据类型 map struct 将其加载到单个表中 假设 ORDER 有以下数据
  • Eclipse CDT 新项目模板 - 如何添加库

    在 Eclipse CDT Indigo 中 有一个新功能允许您将新的 C C 模板项目添加到新项目向导中 我已经弄清楚如何在一定程度上成功地做到这一点 我可以创建一个仅依赖于简单源文件的基本项目 但现在我想创建一个 CPPUnit 项目
  • Python、Chrome 任务管理器 - 以编程方式访问 Chrome 任务管理器的文本而不使用 CHROMIUM

    因此 由于许多人都遇到过 Chrome 的内存使用量可能会让人衰弱的情况 所以我想以编程方式访问 Chrome 的任务管理器 或类似的东西 显示选项卡 它们的 PID 和子帧 如果可能 这样我就可以创建一个脚本来杀死它们 经过大量阅读 很多
  • PetaPoco 在带有触发器的表上插入失败

    我们使用 PetaPoco 作为 SQL 2008 数据库的数据访问工具 当尝试在附加了触发器的表上插入 更新行时 我们遇到了问题 我们正在使用 PetaPoco 的 db Save object 显示的错误是 如果 DML 语句包含 OU
  • 关于 C# 语言规范中隐式转换的问题

    第 6 1 节 隐式转换定义一个身份转换 thusly 身份转换从任何类型转换为相同类型 这种转换的存在使得已经具有所需类型的实体可以说可以转换为该类型 现在 这些句子的目的是什么 在第 6 1 6 节隐式引用转换中 隐式引用转换为 Fro
  • 生成器函数可以用来做什么?

    我开始学习Python 并且遇到了生成器函数 这些函数中包含yield 语句 我想知道这些函数真正擅长解决什么类型的问题 生成器为您提供惰性评估 您可以通过迭代来使用它们 可以显式地使用 for 也可以通过将其传递给任何迭代的函数或构造来隐