【问题标题】:Python defining an iterator class, failed with "iter() returned non-iterator of type 'Fib'"Python 定义了一个迭代器类,失败,“iter() 返回了‘Fib’类型的非迭代器”
【发布时间】:2017-04-16 20:26:10
【问题描述】:

我正在使用 python 2.7 和 ipython2.7。 在 ipython 我试过了:

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()

嗯,它报错了:

TypeError Traceback(最近一次调用最后一次) 在 () 22 23 如果 name == 'ma​​in': ---> 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'

这段代码实际上来自互联网。语法对我来说似乎没问题,但问题是如何发生的?

谢谢。

【问题讨论】:

  • 它在 Python 3 中运行良好。您要么必须开始使用 Python 3,要么更新代码以使用 Python 2。
  • 我现在知道了,__next__() 是针对 Python3 而 next() 是针对 Python 2.7。这太棘手了!

标签: python exception types iterator ipython


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    def __next__(self) 适用于 Python 3

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

    此代码适用于 Python 3 和 Python 2:

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2010-09-23
      • 2014-05-24
      相关资源
      最近更新 更多