2014-04-10 10 views
5

के पेड़ के साथ चारों ओर खेलने, मैं इस व्यवहार पर ठोकर खाई:खाली जनरेटर

def descendants (self): 
    return #or "pass" or "42" 

जाहिर None देता है।

दूसरी ओर तरफ:

def descendants (self): 
    return 
    yield 42 

एक जनरेटर जो कुछ भी अर्जित करता है (वास्तव में व्यवहार मैं पत्र-गांठ के लिए आवश्यक) देता है।

क्या कोई मुझे बता सकता है कि यहां हुड के नीचे क्या हो रहा है?

yield 42 पहुंच योग्य नहीं होना चाहिए? (मुझे लगता है कि कोई फ़ंक्शन जनरेटर या "सामान्य" फ़ंक्शन संकलित समय पर किया जाता है, इस पर आधारित है कि इसमें एक या विभिन्न yield कथन शामिल हैं, चाहे वे पहुंच योग्य हों या नहीं। लेकिन यह अंधेरे में सिर्फ एक शॉट है ।)


संदर्भ निम्न है: मेरे पास पेड़ हैं और प्रत्येक नोड या तो पेड़ या पत्ता है। अब मैं एक नोड के सभी सन्तान उत्पन्न करना चाहते हैं:

class Leaf (Node): 
    @property 
    def descendants (self): 
     return 
     yield 42 

class Tree (Node): 
    @property 
    def descendants (self): 
     for child in self.children: 
      yield child 
      yield from child.descendants 
+0

मैं आमतौर पर केवल 'वापसी()' करता हूं, क्योंकि यह खाली जनरेटर के समान कार्य करता है। – U2EF1

उत्तर

4

मैं यह समझ के रूप में, yield कीवर्ड एक समारोह के अंदर संकलन समय पर पता चला है। नतीजा यह है कि फ़ंक्शन अब सामान्य कार्य की तरह व्यवहार नहीं करता है। जब उपज कीवर्ड वाले फ़ंक्शन को कॉल किया जाता है, तो फ़ंक्शन तुरंत आलसी जेनरेटर ऑब्जेक्ट देता है जो परिभाषित फ़ंक्शन के अनुसार आवश्यक चर उत्पन्न करता है। आपके फ़ंक्शन में कोड केवल तभी चलाया जाता है जब जनरेटर के माध्यम से पुनरावृत्त किया जाता है।

इसे और अधिक संक्षेप here.

तो descendants कहा जाता है के बारे में बताया गया है, और के बाद से yield कीवर्ड समारोह में मौजूद है, एक जनरेटर वस्तु तुरंत दिया जाता है। चूंकि descendants तत्काल return एस है, हालांकि, जेनरेटर कोई मूल्य नहीं कमाता है- लेकिन यह निश्चित रूप से अभी भी जनरेटर है।

+0

लिंक के लिए धन्यवाद। मुझे लिंक किया गया प्रश्न मिला, लेकिन आपके द्वारा लिंक किए गए उत्तर पर स्क्रॉल करने में असफल रहा। मुझे थोड़ा सा पचाने दो। – Hyperboreus

+0

क्या आपके पास भाषा दस्तावेज़ों के लिए कोई लिंक है, क्योंकि यह कुछ भी नहीं कहता है: https://docs.python.org/3.4/tutorial/classes.html#generators – Hyperboreus

+0

@JesseMu +1 आपने स्वच्छ और सटीक स्पष्टीकरण दिया है । –