Python定义迭代器类失败,返回“iter()非Fib”类型的迭代器

2024-04-26 10:33:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python 2.7和ipython2.7。 在伊普顿我试过:

class Fib(object):
    def __init__(self, max):
        super(Fib, self).__init__()
        self.max = max

    def __iter__(self):
        self.a = 0
        self.b = 1
        return self

    def __next__(self):
        fib = self.a
        if fib > self.max:
            raise StopIteration
        self.a, self.b = self.b, self.a + self.b
        return fib

def main():
    fib = Fib(100)
    for i in fib:
        print i

if __name__ == '__main__':
    main()

它报告了一个错误:

类型错误回溯(最近一次调用) 在() 22个 23如果名称='main': --->;24主() 25个

<ipython-input-21-f10bd2d06666> in main()
    18 def main():
    19     fib = Fib(100)
---> 20     for i in fib:
    21         print i
    22

TypeError: iter() returned non-iterator of type 'Fib'

这段代码实际上来自互联网。格莱玛在我看来还行,但问题是怎么发生的呢?

谢谢。


Tags: inselfforreturnifinitmaindef
2条回答

这是python 3代码,迭代器协议使用__next__方法。最好的解决方法是开始使用python 3。但如果您需要python 2,只需将__next__更改为next。更改的原因是为了确保像next这样的魔术方法符合__命名约定。

def __next__(self)用于Python 3

对于Python 2,您需要添加方法next()

此代码将在Python3和Python2下工作:

class Fib(object):
    def __init__(self, max):
        super(Fib, self).__init__()
        self.max = max

    def __iter__(self):
        self.a = 0
        self.b = 1
        return self

    def __next__(self):
        fib = self.a
        if fib > self.max:
            raise StopIteration
        self.a, self.b = self.b, self.a + self.b
        return fib

    def next(self):
        return self.__next__()


def main():
    fib = Fib(100)
    for i in fib:
        print(i)

if __name__ == '__main__':
    main()

相关问题 更多 >