迭代器只能迭代一次吗? [复制]

2024-02-10

考虑以下示例:

def foo(iterator):
    return sum(iterator) / max(iterator)

重复使用同一个迭代器两次是否安全?


不,这不安全。迭代器不是序列。这就是发生的事情foo()使用生成器的函数,生成器本身就是一个迭代器:

>>> foo(x for x in range(10))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in foo
ValueError: max() arg is an empty sequence

这是因为当 after 之后迭代器已经结束了sum()完成了它的工作,所以max()没有从中得到任何额外的物品。一般来说,不可能重置迭代器以使其再次循环。为了foo()函数要正确支持迭代器,必须重写它,以便迭代器仅循环一次,例如通过保存来自iterator进入暂时的tuple or list:

def foo(iterator):
    iterable = list(iterator)
    return sum(iterable) / max(iterable)

or, if iterator产生大量的物品,通过小心使用a来处理它for loop:

def foo(iterator):
    # allows iterables like lists or tuples to be passed as arguments
    iterator = iter(iterator)

    try:
        max_ = next(iterator)
        sum_ = max_
    except StopIteration:
        # iterator yields no items, return some default value
        return 0.0

    for element in iterator:
        sum_ += element
        max_ = max(max_, element)

    return sum_ / max_

这将产生正确的结果:

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

迭代器只能迭代一次吗? [复制] 的相关文章

随机推荐

  • 让用户将记录器注入 Nodejs 模块的最佳实践

    我为 nodejs 编写了这个模块 可用于通过 sockjs 从任何地方向客户端分派事件 现在我想包括一些可配置的日志记录机制 目前 我将 winston 添加为依赖项 要求它作为每个类中的记录器并使用 logger error logge
  • 如何使用 MATLAB 和 JDBC 加速表检索?

    我正在使用 MATLAB 调用的 JDBC 访问 PostGreSQL 8 4 数据库 我感兴趣的表基本上由不同数据类型的各个列组成 他们是通过时间戳来选择的 由于我想检索大量数据 因此我正在寻找一种使请求比现在更快的方法 我现在正在做的事
  • 如何在 XAML 中使用 C# 中定义的画笔资源

    到目前为止我有这个
  • 新的 Conda 环境以及适用于 Jupyter Notebook 的最新 Python 版本

    由于 Python 版本变化很少 我总是忘记如何使用最新的 Python for Jupyter Notebook 创建新的 Conda 环境 所以我想下次将其列出来 从 StackOverflow 来看 有一些答案不再有效 下面是我在 S
  • 从 Apache Cordova 开始

    我刚刚下载了 Apache Cordova 似乎有特定于平台的版本 在将其移植到另一个平台之前 我是否必须为特定平台编写代码 是否可以创建一个多平台项目 我是否正确理解了我应该开始工作的方式 Apache Cordova 主页也是这么说的
  • 网络应用程序的照片存储[重复]

    这个问题在这里已经有答案了 可能的重复 用户镜像 数据库与文件系统存储 https stackoverflow com questions 585224 user images database vs filesystem storage
  • 构建 keras 模型

    我不明白这段代码中发生了什么 def construct model use imagenet True line 1 how do we keep all layers of this model model keras applicat
  • $GOPATH/go.mod 存在,但不应存在于 AWS Elastic Beanstalk 中

    我正在尝试使用 bitbucket 管道和 AWS Elastic Beanstalk 部署基于 gin 框架的 golang 应用程序 我创建了我的包 application zip 其中包含在 EB 内部署应用程序所需的所有文件 当我通
  • 给定一个 WSDL 文件,通过 Internet 使用 Web 服务的步骤是什么?

    我已获得一个 WSDL 文件 我需要通过互联网使用该 WSDL 文件来使用 Web 服务 我需要用 Java 来做这个 有人可以告诉我执行此操作的步骤吗 我也希望获得一些有用的链接 我会使用 JAX WS 拜托 拜托 forget轴或轴 2
  • 在 Optimus 笔记本电脑中以编程方式强制使用 NVIDIA GPU

    我正在编写 DirectX 游戏 当我在 Optimus 笔记本电脑上运行它时 会使用 Intel GPU 导致性能非常糟糕 如果我使用上下文菜单或将可执行文件重命名为 bf3 exe 或其他一些著名的游戏可执行文件名称来强制使用 NVID
  • 在android中使用串口RS-232?

    我想在 Android 设备上使用 JavaComm API 类通过串行端口发送信号 我的想象如下 1 Android 设备为 Archos 3 2 具有 android 2 2 和 USB 主机模式 2 在我的 Android 应用程序中
  • 如何以编程方式启动本地 DynamoDB?

    我能够启动一个local通过以下命令从 bash 启动 DynamoDB 服务器 java Djava library path DynamoDBLocal lib jar DynamoDBLocal jar sharedDb 是否没有一种
  • JavaScript 操作后获取 HTML 源代码

    怎么才能满啊 网页的 HTML 源代码 在运行一些对 HTML 源代码进行操作的 JavaScript 代码之后 我正在使用 VB Net 的 WebbrowserControl 我想为我的自定义 webbrowsercontrol 创建一
  • 将参数传递给使用 chrome.tabs.executeScript() 注入的内容脚本

    如何将参数传递给使用以下方式注入的内容脚本文件中的 JavaScript chrome tabs executeScript tab id file content js 不存在 将参数传递给文件 这样的事情 你什么can要做的就是插入内容
  • 从视图检索数据,我应该使用模型绑定器吗?

    我在这里有点迷失 因为我没有真正看过模型活页夹 所以如果可能的话 如果我真的正确地考虑了我的问题 可以告诉我 如果我的代码是这样的 请建议 1 我有一个 DTO 类 其中包含 自定义字段 每个字段都有名称和其他属性 即 Public Cla
  • 如何从字节数组构造颜色?

    我正在努力完成非常简单的任务 嗯 我认为是这样 我有byte 4 表示颜色值的数组 例如byte 0 alpha byte 1 red等等 如何将此字节数组转换为实际的颜色对象 感谢您的答复 Java 中的字节是有符号的 因此正数部分只能保
  • PyCharm 中的“继承全局站点包”是什么意思?

    当创建一个新的Python项目时 为什么我要选择这个选项 如果我不选择它 我会错过什么功能 我是否无法导入某些 Python 模块 其他答案都不太准确 继承全局站点包 不会 预安装 或 添加包 到您的虚拟环境中 设置为您提供虚拟环境访问权限
  • 如何本地化关键 UIApplicationShortcutItemTitle

    我应该如何本地化密钥UIApplicationShortcutItemTitle 我知道本地化对于像这样的键是如何工作的NSLocationUsageDescription and NSLocationAlwaysUsageDescript
  • 如何在 activeadmin 下拉菜单中的 # 上显示模型标题?

    我创建了一个关联 其中项目有很多任务并且任务属于项目 我已经在 admin tasks rb 中创建了表单 form do f f inputs Details do f input title f input project end f
  • 迭代器只能迭代一次吗? [复制]

    这个问题在这里已经有答案了 考虑以下示例 def foo iterator return sum iterator max iterator 重复使用同一个迭代器两次是否安全 不 这不安全 迭代器不是序列 这就是发生的事情foo 使用生成器