【问题标题】:get iterator value from itertool created variable python从 itertool 创建的变量 python 获取迭代器值
【发布时间】:2021-12-13 18:43:12
【问题描述】:

我创建了一个迭代器来增加各种绘图函数调用中的图形编号:

figndx=itertools.count()

然后我继续在我的代码中调用这些,传递 next(figndx) 作为参数来增加我用于数字编号的值:- 例如:

an.plotimg(ref_frame,next(figndx),'Ref Frame')
an.plotimg(new_frame,next(figndx),'New Frame')

等等……

在某些特定的函数调用之后,我想读回 figndx 值并将其存储在一个变量中以供以后使用。但是,例如,当我查看 figndx 时,它会返回 count(7)。如何从中提取“7”?

我试过了:

figndx

figndx.__iter__()

我在“建议”方法(当我键入点 (.) 时)中找不到任何其他可以获取实际迭代器值的方法。这个可以吗?

`

【问题讨论】:

  • 你想做的就是偷看值,我的意思是在不移动迭代器的情况下获取值?
  • 我认为itertools.count 对象无论如何都不会公开以检索该值。我想,你可以用复古或其他东西来解析字符串表示,但这将依赖于实现细节。
  • right @ Dani Mesejo.... 我在不断寻找替代方案时找到了这个答案,它似乎有效:stackoverflow.com/questions/38101507/…。 figndx.__reduce__()[1][0] 似乎有效。
  • “实际的迭代器”是什么意思? figndx 是实际的迭代器
  • @jrive 是的,绝对不要那样做

标签: python iterator itertools


【解决方案1】:

只需包装一个计数对象

class MyCount:
    def __init__(self, *args, **kwargs):
        self._c = itertools.count(*args, **kwargs)
        self._current = next(self._c)
    def __next__(self):
        current = self._current
        self._current = next(self._c)
        return current
    def __iter__(self):
        return self
    def peek(self):
        return self._current
         

【讨论】:

  • 哇...很酷,但超出了我目前对 Python 的掌握程度。将不得不消化它。谢谢你。那么这个类是如何使用的呢?
  • @jrive 以同样的方式使用,只需使用figndx = MyCount(),然后像以前一样使用figndx。如果您想查看将来自迭代器的下一个值,请使用figndx.peek()
  • 您实际上可以继承itertools.count 并在那里保存一些行。但是这种自定义迭代器方法绝对比(重复)发球更干净!
【解决方案2】:

您可以使用itertools.tee 为自己创建一个窥视器,并封装窥视:

from itertools import count, tee

def peek(iterator):
    iterator, peeker = tee(iterator)
    return iterator, next(peeker)

那么你可以这样称呼它

figndx = count(1)    
next(figndx)
next(figndx)

figndx, next_value = peek(figndx)
next_value
# 3

【讨论】:

  • 但是如果你执行 next(peeker) 3 次和 next(figndx) 两次会发生什么?
  • 当然,每次看你都要让自己成为一个新的偷看者。
  • 谢谢!...不过,我不明白。在函数内,当您执行 x,y =tee(iterator) 时,该值在 peeker 中返回。但是,为什么 tee(figndx) 不能以同样的方式工作?
  • tee 只是拆分成独立的迭代器。这样您就可以在其中一个上调用next 而不会影响另一个。该值由next(peeker)返回
猜你喜欢
  • 2018-03-06
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多