2013-08-15 34 views
5

Tôi đang dần dần quấn quanh đầu máy phát Python.Máy phát trả lại từ một chức năng

Mặc dù đây không phải là vấn đề thực tế trong cuộc sống, tôi vẫn tự hỏi tại sao tôi không thể trả lại máy phát từ một chức năng.

Khi tôi xác định hàm có yield, nó hoạt động như một trình tạo. Nhưng nếu tôi xác định nó bên trong một chức năng khác và cố gắng trả lại thay vào đó, tôi nhận được một chức năng bình thường, tức là không phải là một máy phát điện với phương thức next.

Nói cách khác, tại sao cách tiếp cận give_gen() trong mã bên dưới không hoạt động?

#!/usr/bin/python 

import time 

def gen(d): 
    n = 0 
    while True: 
     n = n + d 
     time.sleep(0.5) 
     yield n 

def give_gen(d): 
    def fn(): 
     n = 0 
     while True: 
      n = n + d 
      time.sleep(0.5) 
      yield n 
    return fn 

if __name__ == '__main__': 

    g = give_gen(3)  # does not work 
    g = gen(3)   # works well 

    while True: 
     print g.next() 
     # AttributeError: 'function' object has no attribute 'next' 
     # in case of give_gen 

Tại sao tôi không thể trả lại trình tạo từ chức năng?

Trả lời

7

Chức năng máy phát chỉ trả lại một máy phát điện chỉ khi được gọi là. Gọi fn để tạo ra các đối tượng phát:

return fn() 

hoặc gọi đối tượng trả về:

g = give_gen(3)() 

Bạn đã gọi gen(); bạn đã từng gọi đến số chỉgen mà không gọi nó, bạn sẽ có tham chiếu đến hàm đó.