Python-die Definition einer iterator-Klasse ist fehlgeschlagen mit "iter() zurückgegeben, nicht-iterator des Typs 'Fib'"
Ich bin mit python 2.7 und ipython2.7.
In ipython habe ich versucht:
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()
Gut es meldet einen Fehler:
TypeError Traceback (most recent call last)
in ()
22
23 wenn Namen == 'main':
---> 24 main()
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'
Dieses Stück code ist eigentlich aus dem internet. Die gramma scheint OK für mich, aber wie das problem passiert?
Dank.
- Es läuft gut in Python 3. Sie müssen entweder die starten mit Python 3, oder aktualisieren Sie den code für die Arbeit mit Python 2.
- Ich weiß jetzt, dass die __next__() for Python ist3 und next() ist für python 2.7. Das ist so schwierig!
Du musst angemeldet sein, um einen Kommentar abzugeben.
def __next__(self)
ist für Python 3Für Python 2 müssen Sie die add-Methode
next()
Dieser code funktioniert unter Python 3 und Python 2:
Dass die python-3-code, wo der iterator-Protokoll verwendet das
__next__
Methode. Die beste Lösung ist, starten Sie mit python 3. Aber wenn Sie benötigen, python 2, ändern Sie einfach__next__
zunext
. Der Grund für die änderung war, um sicherzustellen, dass Magische Methoden wienext
entsprechen den__
Namenskonvention.