如何编写一个可重入的迭代器

时间:2015-10-20 08:37:21

标签: python python-2.7

我想要一个迭代器,它实际上返回了list属性的每个元素。下面的代码有效,但需要一个丑陋的实例变量导致问题:

一旦我创建了另一个迭代器实例(而不是重复使用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")

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分: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")