2016-06-20 27 views
6

Tôi đang sử dụng lợi nhuận để trả lại giá trị tiếp theo trong hàm tiếp theo trong lớp của tôi. Nhưng nó không trả về giá trị tiếp theo, nó trả về đối tượng máy phát. Tôi đang cố gắng hiểu rõ hơn về vòng lặp và năng suất. Tôi có thể làm điều đó một cách sai lầm. Xin hãy xem.khi tôi thực hiện năng suất từ ​​bên trong __next__. tại sao nó trở lại đối tượng máy phát điện?

class MyString: 
    def __init__(self,s): 
     self.s=s 

    def __iter__(self): 
     return self 

    def __next__(self): 
     for i in range(len(self.s)): 
      yield(self.s[i]) 

r=MyString("abc") 
i=iter(r) 
print(next(i)) 

này trả về: đối tượng __next__

máy phát điện tại 0x032C05A0

+1

['__next__' trả về mục tiếp theo trong trình vòng lặp] (https://docs.python.org/3/library/stdtypes.html#iterator.__next__) để làm cho' __next__' một trình tạo không thực sự có ý nghĩa, hoặc nó có nghĩa là mọi giá trị của bộ lặp 'MyString' của bạn là một trình tạo. –

+2

MyString không được xác định '__next__'. '__next__' dành cho các trình vòng lặp, không lặp lại được. Tương tự, nó không nên 'trả về self' cho' __iter__'. – user2357112

Trả lời

4

next khá nhiều chỉ gọi __next__() trong trường hợp này. Gọi __next__ trên đối tượng của bạn sẽ khởi động máy phát và trả lại (không có phép thuật nào được thực hiện tại thời điểm này).


Trong trường hợp này, bạn thể có thể nhận được ngay với không xác định __next__ tại tất cả:

class MyString: 
    def __init__(self,s): 
     self.s=s 

    def __iter__(self): 
     for i in range(len(self.s)): 
      yield(self.s[i]) 
     # Or... 
     # for item in self.s: 
     #  yield item 

Nếu bạn muốn sử dụng __iter____next__ (để xác định một iterator chứ không phải chỉ đơn giản là thực hiện một số iterable), bạn có thể muốn thực hiện một việc như sau:

class MyString: 
    def __init__(self,s): 
     self.s = s 
     self._ix = None 

    def __iter__(self): 
     return self 

    def __next__(self): 
     if self._ix is None: 
      self._ix = 0 

     try: 
      item = self.s[self._ix] 
     except IndexError: 
      # Possibly reset `self._ix`? 
      raise StopIteration 
     self._ix += 1 
     return item 
+0

@MosesKoledoye - Bạn đang nói với tôi để thêm nó, hoặc hỏi tại sao tôi thêm nó? :-) – mgilson

+0

Tôi chưa thấy bản chỉnh sửa gần đây. Đã hỏi tại sao nó bị thiếu –

+1

@MosesKoledoye - Vâng, đó là một sự giám sát trong bài viết gốc mà tôi đã sửa khi bạn đang bình luận. Tôi cũng nhận ra rằng việc gọi 'iter (mystring)' có lẽ không nên thiết lập lại sự lặp lại ... Cảm ơn bạn đã watchin 'trở lại của tôi. :-) – mgilson

Các vấn đề liên quan