2012-06-25 34 views
6

Tôi đang cố gắng sử dụng trình tạo với lớp Python hoạt động tương tự như một danh sách được liên kết.Năng suất trên cấu trúc dữ liệu đệ quy

Dưới đây là một ví dụ rất đơn giản về những gì tôi có nghĩa là:

class GeneratorTest(): 
    def __init__(self, list): 
     if list: 
      self.elem = list[0] 
      if list[1:]: 
       self.n = GeneratorTest(list[1:]) 
      else: 
       self.n = None 

    def __iter__(self): 
     return self 

    def next(self): 
     my_next = self 
     while my_next is not None: 
      yield my_next 
      my_next = my_next.n 

Tất nhiên đây chỉ là một ví dụ, nhưng nó đủ để minh họa cho điểm.

Bây giờ, tôi đã mong để có thể gọi một cái gì đó như:

g = GeneratorTest([1,2,3,4,5]) 
for x in g: 
    print x 

Và có điểm dừng chu kỳ khi nó đạt đến giá trị cuối cùng, nhưng cho vòng lặp chỉ tiếp tục không ngừng.

Tôi khá mới đối với máy phát điện, vì vậy tôi chắc chắn đó là tiền đề cơ bản mà tôi thiếu ở đây.

Có phải vấn đề liên quan đến thực tế là tôi mang lại cùng một đối tượng tạo bộ tạo không? Tôi chắc chắn rằng nếu tôi có một đối tượng với danh sách các đối tượng GeneratorTest, tôi có thể trả về từng đối tượng này một cách đơn giản, nhưng tôi cảm thấy có một cách để thực hiện công việc này mà không có đối tượng "wrapper".

tôi thiếu gì ở đây?

+0

'danh sách' là tên của nội trang dựng sẵn, vì vậy bạn đang che khuất nó khi bạn sử dụng nó làm đối số cho phương thức' __init__' của bạn. – MattH

+0

vâng, vâng, tôi biết, đây chỉ là một ví dụ tôi đã tấn công và không bận tâm với tên. Mã thực sự là tương tự trong logic nhưng với tên có ý nghĩa và không làm lu mờ nội trang. Cảm ơn bạn đã chỉ ra điều đó! – pcalcao

+0

Rất hữu ích khi cung cấp các ví dụ hay: tự chứa và minh họa. – MattH

Trả lời

4

Vấn đề là next (hoặc trong Py3, __next__) không được là máy phát điện - nên duy trì trạng thái bên ngoài và return mỗi giá trị. Mỗi lần bạn luôn trả lại một trình tạo mới, nhưng vì Python không lặp lại trên rằng máy phát điện, vòng lặp của bạn không bao giờ thực sự chạy. Điều này có thể có nghĩa là bạn muốn __iter__ trả lại cái gì đó khác với số self ban đầu (mặc dù mọi thứ nó trả về là bắt buộc để có một số __iter__ tự trả về tự).

Nhưng tin tốt là máy phát điện tồn tại chính xác để theo dõi các quy tắc này cho bạn. Di chuyển mã next hiện tại của bạn vào __iter__ và mọi thứ hoạt động - Python làm lặp qua bất kỳ số nào __iter__ trả lại (như bạn mong đợi).

+0

Thật vậy nó! Điều đó có ý nghĩa hơn bây giờ. – pcalcao

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