2013-08-15 15 views
5

मैं धीरे-धीरे पाइथन जनरेटर के आसपास अपने सिर को लपेटने जा रहा हूं।फ़ंक्शन से रिटर्निंग जनरेटर

हालांकि यह अब के लिए वास्तविक जीवन समस्या नहीं है, मैं अब भी सोच रहा हूं कि मैं एक फ़ंक्शन से जनरेटर क्यों नहीं लौटा सकता।

जब मैं yield के साथ फ़ंक्शन को परिभाषित करता हूं, तो यह जनरेटर के रूप में कार्य करता है। लेकिन अगर मैं इसे के अंदर परिभाषित करता हूं और इसके बजाय इसे वापस करने का प्रयास करता हूं, तो मुझे सामान्य कार्य मिलता है, यानी next विधि वाला जनरेटर नहीं।

दूसरे शब्दों में, give_gen() नीचे दिए गए कोड में क्यों काम नहीं करता है?

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

मैं फ़ंक्शन से जेनरेटर क्यों नहीं लौटा सकता?

उत्तर

7

एक जनरेटर फ़ंक्शन केवल जनरेटर देता है जब कहा जाता है।

return fn() 

या लौटे वस्तु फोन: जनरेटर वस्तु बनाने के लिए fn कॉल

g = give_gen(3)() 

आप किया कॉल gen(); क्या आपने को केवलgen पर कॉल किए बिना कहा था कि आपको उस फ़ंक्शन का संदर्भ होगा।

संबंधित मुद्दे