2010-10-26 60 views
6

以下程序的目標是學習Python生成器和迭代器實現,以便理解Python魔法方法。爲我的自定義迭代器實現iteritems函數?

我卡在實施iteritems()函數。另外,我想知道我是否正確的方向,或者我在理解python魔術方法時在概念上是錯誤的。

import random 

class Random(object): 
    """ generate randomised int of specified length --> [r1, r2, r3....] """ 

    def __init__(self, length = 1, rand_range = 100): 
     self.index = 0 
     self.generated_range = [] 
     self.length = length if str(length).isdigit() else 1 
     self.rand_range = rand_range if str(rand_range).isdigit() else 100 

    def __iter__(self): return self 

    def next(self): 
     if self.index < self.length: 
      item = random.randrange(0, self.rand_range) 
      self.generated_range.append(item) 
      self.index += 1 
      return item 
     raise StopIteration 

    def __eq__(self, obj): 
     if self.length == obj.length and self.rand_range == obj.rand_range: 
      return True 
     return False 

    def __len__(self): 
     return self.length 

    def __contains__(self, item): 
     if not self.index == self.length: 
      while self.next(): continue 
     if item in self.generated_range: 
      return True 
     return False 

    def __getitem__(self, key): 
     if key in self.generated_range: 
      return key * 100 
     raise KeyError 

    def __setitem__(self, key, value): 
     raise NotImplemented 

    def __delitem__(self, key): 
     raise NotImplemented 

    def iteritems(self): 
     if not self.index == self.length: 
      while self.next(): continue 
     for item in self.generated_range: 
      yield item 

if __name__ == '__main__': 
    r1 = Random(10) 
    print [ r for r in r1] 
    print 10 in r1 
    r2 = Random(20) 
    print r2.iteritems() 

回答

4

iteritems應該返回的(關鍵,VAL)對的序列一本字典,所以我不認爲這是適合你的類。如果您創建了UserDict的後代,那麼可能有一個情況可以覆蓋它。

如果您確實重寫了iteritems,您應該通過產生鍵值對來實現。

可憐的程序員的覆蓋:

def iteritems(self): 
    return iter([(x[0], x) for x in "alpha bravo charlie".split()])