2015-10-20 61 views
1

我想要一个迭代器,它基本上返回列表属性的每个元素。下面的代码工作,但需要一个丑陋的实例变量导致问题:如何编写可重入迭代器

只要我创建另一个迭代器实例(而不是重新使用testIter)嵌套循环工作正常,但这似乎不是一个选项,我的全部生活问题。

如何摆脱实例变量而不牺牲整洁的对于语法中的某些内容?

class MyIterator(object): 
    def __init__(self, myList): 
     self._list = myList 

    def __iter__(self): 
     self.cursor = 0 
     return self 

    def next(self): 
     try: 
      nextElem = self._list[self.cursor] 
     except IndexError: 
      raise StopIteration 
     else: 
      self.cursor += 1 
      return nextElem 


def test(l): 
    testIter = MyIterator(l) 
    for line in testIter: 
     for column in testIter: 
      print "{}/{}".format(line, column), 
     print 

if __name__ == "__main__": 
    test("abc") 

回答

0

这是,我怎么找到它的工作。我不记得,我在哪里找到提案,__iter__应该只是回报自己,并没有其他许多,但它是更加整洁这种方式。

class MyIterator(object): 
    def __init__(self, myList): 
     self._list = myList 

    def __iter__(self): 
     for nextElem in self._list: 
      yield nextElem 

def test(l): 
    testIter = MyIterator(l) 
    for line in testIter: 
     for column in testIter: 
      print("{}/{}".format(line, column)) 
     print() 

if __name__ == "__main__": 
    test("abc") 
0

为什么不使用装饰@staticmethod

@staticmethod 
def test(l): 
    testIter = MyIterator(l) 
    for line in testIter: 
     for column in testIter: 
      print "{}/{}".format(line, column), 
     print 

For Reference

这种使用可以直接调用与类名称的功能使该方法是静态的。

MyIterator.test("abc") 
+0

谢谢你的提示,但我不认为演示例程应该是类的一部分。不幸的是,答案并没有真正解决核心问题。 – guidot