संक्षेप में, जब भी आपके प्रोग्राम में कंट्रोल return स्टेटमेंट तक पहुंचता है, प्रोग्राम का निष्पादन समाप्त हो जाता है और शेष स्टेटमेंट निष्पादित नहीं होते।
हालांकि, yield के मामले में, जब भी कंट्रोल आपके प्रोग्राम में yield स्टेटमेंट तक पहुंचता है, आपके प्रोग्राम का निष्पादन रुक जाता है और बाद में हम फ़ंक्शन में अन्य स्टेटमेंट जारी रख सकते हैं।
आइए दोनों स्टेटमेंट को विस्तार से समझते हैं।
Yield
किसी फ़ंक्शन में yield स्टेटमेंट का उपयोग उसे एक जेनरेटर फ़ंक्शन बनाता है जिसे लूप में उपयोग किया जा सकता है। जब फ़ंक्शन चल रहा होता है और yield स्टेटमेंट निष्पादित होता है, तो yield के बाद का मान उस लूप को वापस पास किया जाता है जिसने इसे कॉल किया था। अगली बार जब लूप पुनरावृति करता है, तो फ़ंक्शन yield स्टेटमेंट के तुरंत बाद से शुरू होता है।
def func():\n yield 1\n yield 2\n yield 3\n\nfor num in func():\n print(num * num)
आउटपुट
1\n4\n9
उपरोक्त प्रोग्राम में, फ़ंक्शन को आमंत्रित करने वाला लूप तब पूरा होगा जब func फ़ंक्शन पूरा हो जाए - या तो फ़ंक्शन के अंत (func()) तक पहुंचने पर या return स्टेटमेंट पर।
हालांकि, वही जेनरेटर फ़ंक्शन उपयोग करने वाला कोई भी नया लूप फ़ंक्शन को शुरुआत से फिर से निष्पादित करेगा।
Return
एक return स्टेटमेंट:
किसी फ़ंक्शन के निष्पादन को रोकने और वैकल्पिक रूप से कॉलर को एक मान वापस करने के लिए उपयोग किया जाता है। एक फ़ंक्शन जिसमें return है (लेकिन yield नहीं) लूप में उपयोग नहीं किया जा सकता (उपरोक्त yield के विपरीत)।
यदि पहले निष्पादित फ़ंक्शन को फिर से कॉल किया जाता है, तो फ़ंक्शन शुरुआत से निष्पादन शुरू करता है (उपरोक्त yield के विपरीत)।
return या yield कब उपयोग करें?
जब हम किसी अनुक्रम पर पुनरावृति करना चाहते हैं, लेकिन संसाधन बाधाओं के कारण या केवल पूरे अनुक्रम को मेमोरी में संग्रहीत नहीं करना चाहते हैं, तो yield का उपयोग करने की सिफारिश की जाती है। अन्य मामलों में हम return स्टेटमेंट का उपयोग करने के बारे में सोच सकते हैं।
आइए एक और प्रोग्राम देखें जो पूर्णांक के वर्ग उत्पन्न करने के लिए yield स्टेटमेंट का उपयोग करता है।
def Square():\n i = 1\n # वर्ग उत्पन्न करने के लिए अनंत लूप\n while True:\n yield i * i\n i += 1 # अगला निष्पादन इस बिंदु से फिर से शुरू होता है\n\nfor num in Square():\n if num > 100:\n break\n print(num)
आउटपुट
1\n4\n9\n16\n25\n36\n49\n64\n81\n100
yield स्टेटमेंट का आमतौर पर try...finally ब्लॉक के try क्लॉज में उपयोग नहीं किया जाता है क्योंकि इसकी कोई गारंटी नहीं है कि जेनरेटर कभी फिर से शुरू होगा, इसलिए कोई गारंटी नहीं है कि finally ब्लॉक कभी निष्पादित होगा।