检测迭代器是否会被消耗

2024-03-20

是否有一种统一的方法来知道迭代是否会消耗可迭代对象?

假设你有一个特定的函数crunch它要求一个可迭代对象作为参数,并多次使用它。就像是:

def crunch (vals):

    for v in vals:
        chomp(v)

    for v in vals:
        yum(v)

(注:将两者合并在一起for循环不是一个选项)。

如果使用不是列表的可迭代对象调用函数,就会出现问题。在下面的调用中yum函数永远不会被执行:

crunch(iter(range(4))

原则上我们可以通过重新定义来解决这个问题crunch函数如下:

def crunch (vals):
    vals = list(vals)

    for v in vals:
        chomp(v)

    for v in vals:
        yum(v)

但这会导致使用两倍的内存,如果调用crunch is:

hugeList = list(longDataStream)
crunch(hugeList)

我们可以通过定义来解决这个问题crunch像这样:

def crunch (vals):
    if type(vals) is not list:
        vals = list(vals)

    for v in vals:
        chomp(v)

    for v in vals:
        yum(v)

但仍然可能存在调用代码将数据存储在以下位置的情况:

  • 不能食用
  • 不是一个列表

例如:

from collections import deque
hugeDeque = deque(longDataStream)
crunch(hugeDeque)

如果有一个isconsumable谓词,以便我们可以定义crunch像这样:

def crunch (vals):
    if isconsumable(vals):
        vals = list(vals)

    for v in vals:
        chomp(v)

    for v in vals:
        yum(v)

这个问题有解决办法吗?


一种可能性是测试该项目是否是序列,使用isinstance(val, collections.Sequence)。仍然不能完全保证不可消耗性,但我认为这已经是你能得到的最好的了。 Python 序列必须有一个长度,这意味着它至少不能是一个开放式迭代器,并且通常意味着必须提前知道元素,这又意味着它们可以被迭代而不消耗它们。仍然可以编写符合序列协议但不可重复的病态类,但您永远无法处理这些类。

请注意,两者都不是Iterable nor Iterator是适当的选择,因为这些类型不保证长度,因此不能保证迭代是有限的,更不用说可重复了。但是,您可以检查两者Sized and Iterable.

重要的是记录您的函数将对其参数进行两次迭代,从而警告用户必须传入支持此功能的对象。

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

检测迭代器是否会被消耗 的相关文章

  • (discord.py) 尝试更改成员角色时,“用户”对象没有属性“角色”

    因此 我正在尝试编写一个机器人 让某人在命令中指定的主持人指定的一段时间内暂停角色 我知道该变量称为 小时 即使它目前以秒为单位 我稍后会解决这个问题 基本上 它是由主持人在消息 暂停 personmention numberofhours
  • InterfaceError:连接已关闭(使用 django + celery + Scrapy)

    当我在 Celery 任务中使用 Scrapy 解析函数 有时可能需要 10 分钟 时 我得到了这个信息 我用 姜戈 1 6 5 django celery 3 1 16 芹菜 3 1 16 psycopg2 2 5 5 我也使用了psyc
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

    我有 2 个带有几何列的地理数据框 我将一些几何图形从 1 个复制到另一个 这对于多边形效果很好 但对于任何 有效 多多边形都会返回 ValueError 请指教如何解决这个问题 我不知道是否 如何 为什么应该更改 MultiPolygon
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 为美国东部以外地区的 Cloudwatch 警报发送短信?

    AWS 似乎没有为美国东部以外的 SNS 主题订阅者提供 SMS 作为协议 我想连接我的 CloudWatch 警报并在发生故障时接收短信 但无法将其发送到 SMS YES 经过一番挖掘后 我能够让它发挥作用 它比仅仅选择一个主题或输入闹钟
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐

  • 在 Tkinter 中按下按钮后如何清除 Entry 小部件?

    我正在尝试清除Entry用户使用 Tkinter 按下按钮后的小部件 我尝试使用ent delete 0 END 但我收到错误消息说字符串没有该属性delete 这是我的代码 我在其中遇到错误real delete 0 END secret
  • C# 数组是否保证在内存中顺序存储?

    根据互联网上的许多资料 在 C 中 数组是按顺序存储的 也就是说 如果我有一个指向数组中第一个元素的指针 比如说int start array 0 然后我可以访问array i 通过做 start i 但是 我正在查看存储在中的 C 语言规
  • 在Python中,使用bisect在字典列表中查找项目

    我有一个字典列表 如下所示 test data offset 0 data 1500 offset 1270 data 120 offset 2117 data 30 offset 4055 data 30000 字典项在列表中按照以下顺序
  • 将 MBean 从 JBoss 4.x 移植到 JBoss 7

    我们目前正在将一些项目从 JBoss 4 x 移植到 JBoss 7 到目前为止 一切似乎都工作正常 除了 MBean 之外 我们通常使用 MBean 来提供简单的管理操作 我已经搜索了很长一段时间 但要么我无法提出正确的搜索词 要么我缺少
  • 在使用“with”子句的查询中使用 Laravel 的 toSql

    我正在 Laravel 工作 我有兴趣检查由包含 with 语句的 Eloquent 查询生成的 SQL 语句 由于某种原因 我只得到主要查询 例如 当我跑步时 class Child extends EloquentVersioned p
  • jQuery 选择列表删除所有选项

    我有一个
  • 如何在iOS项目中使用dylib库和hpp头文件?

    我已经获得了一个 dylib 库和一个 hpp 头文件 我应该在 Xcode 中的 iOS 项目中使用它们 我一直在网上查找 但所有答案都很简洁 没有具体的步骤可遵循 我只需将这些文件复制到我的项目中吗 如何在 Obj C 类中创建 使用库
  • 如何估计线程上下文切换开销?

    我正在尝试通过实时截止日期来提高线程应用程序的性能 它运行在 Windows Mobile 上并用 C C 编写 我怀疑高频率的线程切换可能会导致有形的开销 但既不能证明也不能反驳它 众所周知 缺乏证据并不是相反的证明 因此我的问题是双重的
  • iPhone UITableView:如何删除组样式表中各部分之间的间距?

    我正在创建一个表格视图 其中有 10 个部分 所有部分都有标题视图 但没有单元格 所以 简而言之 我的表视图将仅显示 10 个标题视图 任何部分都不会有单元格 现在 当我这样做时 该部分的标题视图之间有一些空间 我想删除那个空格 那可能吗
  • 在 Flutter 中显示几秒钟后没有执行操作按钮时关闭 AlertDialog

    我有一个 AlertDialog 弹出几秒钟 然后自动弹出 没有执行任何操作按钮 弹出后 会显示另一个AlertDialog 我怎样才能做到这一点 这是我的示例代码 初始化计时器以显示第一个对话框 timerToShowFirstDialo
  • AVFoundation,在预览层中剪掉边缘

    我正在开发一些 iOS 应用程序 我需要在其中进行一些相机扫描 这是我第一次体验 AVFoundation 之前我使用 UIImagePickerController 开发相机应用程序 但 AVFoundation 似乎更强大 问题是它会切
  • 使用 doPost 将文件上传到 Google Web Apps

    我正在尝试使用 doPost e 将文件上传到 Google Web App 如下所示 function doPost e var blob e parameter myFile DriveApp createFile blob 然后将文件
  • Intel x86 与 AMD x86 CPU 上的访问性能不一致

    我已经实现了一个带有结构内存布局数组的简单线性探测哈希图 该结构包含键 值和指示条目是否有效的标志 默认情况下 该结构体由编译器填充 因为键和值是 64 位整数 但该条目仅占用 8 个布尔值 因此 我也尝试以未对齐访问为代价来打包结构 由于
  • 使用 pdfnet 下划线会导致不同的线条粗细

    我用来为所选文本添加下划线的代码 我开始调用 addUnderline 方法 其他方法是辅助方法 private pdftron SDF Obj CreateUnderlineAppearance pdftron PDF Rect bbox
  • Python 和 numpy:从 1 维数组中逐行减去 2 维数组

    在python中 我希望从1维数组中逐行减去2维数组 我知道如何使用 for 循环和索引来完成此操作 但我认为使用 numpy 函数可能会更快 但是我没有找到办法做到这一点 这是一个带有 for 循环的示例 from numpy impor
  • 文件 -> 在 MonoDevelop 中打开网站?

    我无法在 MonoDevelop 中打开现有网站 我尝试了各种选择但没有成功 有什么办法可以做到这一点吗 Visual Studio 有这个功能并且运行得很好 但我想在我当前的项目中尝试使用 MonoDevelop MonoDevelop
  • 在 Linux 中如何判断哪个进程向我的进程发送了信号

    我有一个java应用程序SIG TERM 我想知道发送这个信号的进程的pid 那可能吗 两种 Linux 特定的方法是SA SIGINFO http www kernel org doc man pages online pages man
  • 如何获得 TreeNodes 的 TreeView 行为,当您检查一个 TreeNodes 时,它会检查其所有子 TreeNodes?

    这与大多数应用程序的行为方式相同 我认为 TreeView 默认情况下是这样工作的 有没有办法做到这一点 或者我是否必须获取已检查的 TreeNode 的所有子节点并自己检查它们 这是winform 你需要自己做 但另一方面这并不难 pri
  • 块范围内没有链接?

    块中声明的所有变量是否都 无链接 例如 1 如果我声明一个静态变量 void foo static int i 它有内部联系还是没有联系 如果没有链接 那为什么要使其静态呢 2 如果我使用 extern 会发生什么 global scope
  • 检测迭代器是否会被消耗

    是否有一种统一的方法来知道迭代是否会消耗可迭代对象 假设你有一个特定的函数crunch它要求一个可迭代对象作为参数 并多次使用它 就像是 def crunch vals for v in vals chomp v for v in vals