【问题标题】:Can iterator be restored and can its value/status be assigned?可以恢复迭代器并且可以分配它的值/状态吗?
【发布时间】:2010-07-09 09:44:21
【问题描述】:

我有下面的 sn-p 它使用生成器来提供新的 ID

...

    def __init__(self, id_generator = None):
        if id_generator is None: id_generator = 0

        if isinstance(id_generator, int):
            import itertools
            self._generator = itertools.count(id_generator)

        else:
            self._generator = id_generator
...

    id = self._generator.next()  #0
    id = self._generator.next()  #1
    id = self._generator.next()  #2
    id = self._generator.next()  #3

我的问题是,假设我有一个现有的 id 号码,例如 int(99) 需要被接受 在运行时需要_generator生成从99开始的ID。 看起来像:

0
1
2
3
4
             <---- new id number 99 be given in somehow
99
100
101

如何将它反馈给 _generator? 只需使用self._generator = itertools.count(99) 还是有更好的方法?

更多,sucn 混淆可以更概括:我如何备忘录/分配生成器的 如果不是 int 类型的状态/值?

谢谢!

【问题讨论】:

  • 好吧,self._generator = itertools.count(99) 有什么问题?
  • 我还想将 _generator 保持为“正式”状态并使用另一个副本进行处理,来自 C void swap(a,b) 的个人暴躁,现在我知道我可以使用 tee()。谢谢

标签: python iterator duplicates generator restore


【解决方案1】:

不,生成器只是生成项目,一旦创建,您就无法设置或保存它们的状态。所以self._generator = itertools.count(99) 确实是最好的选择。

您可以用itertools.tee 复制一个生成器,它会记住第一个可迭代对象的输出序列并将其传递给新的生成器。

您还可以编写一个从您可以更改的源中提取的生成器:

class counter(object):
    def __init__(self, current=0):
        self.current = current

    def __iter__(self):
        def iter():
            while True:
                yield self.current
                self.current += 1 # 
        return iter()

    def set(self,x):
        self.current = x

s = counter()
t = iter(s)
print t.next() # 0
s.set(20)
print t.next() # 21

【讨论】:

  • 谢谢,关于 yield self.current 和 s.set(20),这是否意味着产生了 - 不仅是 int,我可以使用 set 将其设置回状态?如果是这样,这是否意味着我可以设计 yeild 甚至产生任何类实例,甚至是迭代器本身?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 2014-01-31
  • 2021-06-02
  • 2010-12-13
  • 1970-01-01
  • 2019-05-03
  • 2013-12-21
相关资源
最近更新 更多