2010-07-09 45 views
2

我有低於使用發電機給新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)或有更好的方法?

更多的是,如果它不是一個int類型的話,我可以如何備忘/指定發生器的狀態/值?

謝謝!

+1

好,這有什麼錯'self._generator = itertools.count(99)'? – SilentGhost 2010-07-09 09:52:50

+0

我也想保持_generator作爲「正式」的地位,並使用另一個副本進行處理,C void swap(a,b)的個人曲折,現在我明白我可以使用tee()。謝謝 – 2010-07-09 14:35:01

回答

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 
+0

謝謝,關於產量self.current和s.set(20),這意味着什麼產生 - 不僅是int,我可以使用set來將其設置回狀態?如果是這樣,那是否意味着我可以設計yeild甚至是迭代器自己的任何類實例? – 2010-07-09 14:40:57

相關問題