2015-01-30 14 views
7

Ai đó có thể vui lòng giải thích lý do tại sao đoạn mã sau là choLoại lỗi Iter - Python3

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

này đang làm việc trong python 2.7.3 mà không cần bất kỳ lỗi.

#!/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) 

Trả lời

16

Trong python3.x bạn cần sử dụng __next__() thay vì next().

từ What’s New In Python 3.0:

PEP 3114: các phương pháp tiêu chuẩn tiếp theo() đã được đổi tên thành __next __().

Tuy nhiên, nếu bạn muốn đối tượng của bạn là iterable cả 2.X python và 3.x bạn có thể gán chức năng next của bạn để tên __next__.

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

Bạn cần __next__(self) không tiếp theo:

def __next__(self):