2015-01-30 17 views
7

Kann jemand bitte erklären, warum der folgende CodeTyp Fehler Iter - Python3

TypeError: iter() returned non-iterator of type 'counter' in python 3 

geben Dies ist in Python 2.7.3 ohne Fehler arbeiten.

#!/usr/bin/python3 

class counter(object): 

    def __init__(self,size): 
     self.size=size 
     self.start=0 

    def __iter__(self): 
     print("called __iter__",self.size) 
     return self 

    def next(self): 
     if self.start < self.size: 
      self.start=self.start+1 
      return self.start 
     raise StopIteration 

c=counter(10) 
for x in c: 
    print(x) 

Antwort

16

In python3.x müssen Sie __next__() statt next() verwenden.

von What’s New In Python 3.0:

PEP 3114: die Standard-Methode next() umbenannt wurde __ __next().

Wenn Sie jedoch Ihr Objekt wollen iterable sein, sowohl in Python 2.x und 3.x Sie Ihre next Funktion mit dem Namen __next__ zuweisen können.

class counter(object): 

    def __init__(self,size): 
     self.size=size 
     self.start=0 

    def __iter__(self): 
     print("called __iter__",self.size) 
     return self 

    def next(self): 
     if self.start < self.size: 
      self.start=self.start+1 
      return self.start 
     raise StopIteration 

    __next__ = next # Python 3.X compatibility 
5

Sie benötigen die __next__(self) nicht weiter:

def __next__(self):