अजगर की उपज क्या है?
अजगर में उपज कीवर्ड एकमात्र के साथ वापसी की तरह काम करता है
अंतर यह है कि मान वापस करने के बजाय, यह कॉलर को एक जनरेटर ऑब्जेक्ट वापस देता है।
जब किसी फ़ंक्शन को कॉल किया जाता है और निष्पादन का थ्रेड फ़ंक्शन में एक उपज कीवर्ड पाता है, तो फ़ंक्शन निष्पादन उस रेखा पर ही रुक जाता है और यह कॉलर ऑब्जेक्ट को कॉलर पर वापस लौटाता है।
इस पायथन ट्यूटोरियल में, आप सीखेंगे:
- अजगर की उपज क्या है?
- वाक्य - विन्यास
- अजगर में जेनरेटर क्या हैं?
- सामान्य फ़ंक्शन v / s जेनरेटर फ़ंक्शन के बीच अंतर।
- जनरेटर से मूल्यों को कैसे पढ़ें?
- जनरेटर एक बार उपयोग कर रहे हैं
- उदाहरण: फाइबोनैचि श्रृंखला के लिए जनरेटर और उपज
- उदाहरण: यील्ड के साथ कॉलिंग फ़ंक्शन
- पायथन में रिटर्न के बजाय यील्ड का उपयोग कब करें
- यील्ड बनाम रिटर्न
वाक्य - विन्यास
yield expression
विवरण
अजगर की उपज एक जनरेटर वस्तु देता है। जनरेटर विशेष कार्य हैं जिन्हें मान प्राप्त करने के लिए पुनरावृत्त होना पड़ता है।
उपज कीवर्ड एक जनरेटर फ़ंक्शन में दी गई अभिव्यक्ति को परिवर्तित करता है जो एक जनरेटर ऑब्जेक्ट को वापस देता है। वस्तु के मूल्यों को प्राप्त करने के लिए, उपज को दिए गए मूल्यों को पढ़ने के लिए इसे पुनरावृत्त करना होगा।
उदाहरण: उपज विधि
यहाँ उपज का एक सरल उदाहरण है। फ़ंक्शन टेस्टील्ड () में स्ट्रिंग के साथ एक उपज कीवर्ड होता है "गुरु99 पायथन ट्यूटोरियल में आपका स्वागत है"। जब फ़ंक्शन को बुलाया जाता है, तो आउटपुट प्रिंट होता है और यह वास्तविक मूल्य के बजाय एक जनरेटर ऑब्जेक्ट देता है।
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()print(output)
आउटपुट:
दिया गया आउटपुट एक जेनरेटर ऑब्जेक्ट है, जिसका मूल्य हमें उपज के लिए दिया जाता है।
लेकिन हमें वह संदेश नहीं मिल रहा है जो हमें आउटपुट में देने के लिए दिया गया है!
पैदावार के लिए दिए गए संदेश को प्रिंट करने के लिए जेनरेटर ऑब्जेक्ट को नीचे दिए उदाहरण में दिखाया गया है:
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()for i in output:print(i)
उत्पादन
Welcome to Guru99 Python Tutorials
अजगर में जेनरेटर क्या हैं?
जनरेटर वे कार्य हैं जो एक पुनरावृत्त जनरेटर वस्तु को लौटाते हैं। जनरेटर ऑब्जेक्ट से मूल्यों को एक साथ पूरी सूची के बजाय एक बार में लाया जाता है और इसलिए वास्तविक मूल्यों को प्राप्त करने के लिए आप अगली () या सूची () विधि का उपयोग करके फॉर-लूप का उपयोग कर सकते हैं।
जनरेटर फ़ंक्शन का उपयोग करना
आप जनरेटर फ़ंक्शन का उपयोग करके और जनरेटर अभिव्यक्ति का उपयोग करके जनरेटर बना सकते हैं।
एक जनरेटर फ़ंक्शन एक सामान्य फ़ंक्शन की तरह है, रिटर्न वैल्यू होने के बजाय इसमें एक उपज कीवर्ड होगा।
एक जनरेटर फ़ंक्शन बनाने के लिए आपको एक उपज कीवर्ड जोड़ना होगा। निम्नलिखित उदाहरण दिखाता है कि जनरेटर फ़ंक्शन कैसे बनाया जाए।
def generator():yield "H"yield "E"yield "L"yield "L"yield "O"test = generator()for i in test:print(i)
आउटपुट:
HELLO
सामान्य फ़ंक्शन v / s जेनरेटर फ़ंक्शन के बीच अंतर।
आइए हम समझते हैं कि एक जनरेटर फ़ंक्शन सामान्य फ़ंक्शन से कैसे भिन्न होता है।
2 कार्य normal_test () और जनरेटर_test () हैं।
दोनों कार्यों को "हैलो वर्ल्ड" स्ट्रिंग वापस करने के लिए माना जाता है। Normal_test () रिटर्न का उपयोग कर रहा है और जनरेटर_test () उपज का उपयोग कर रहा है।
# Normal functiondef normal_test():return "Hello World"#Generator functiondef generator_test():yield "Hello World"print(normal_test()) #call to normal functionprint(generator_test()) # call to generator function
आउटपुट:
Hello World
आउटपुट दिखाता है कि जब आप सामान्य फ़ंक्शन को normal_test () कहते हैं तो यह हैलो वर्ल्ड स्ट्रिंग लौटाता है। उपज कीवर्ड के साथ एक जनरेटर फ़ंक्शन के लिए यह 0x00000012F2F5BA20>
यह एक जनरेटर फ़ंक्शन और एक सामान्य फ़ंक्शन के बीच मुख्य अंतर है। अब जनरेटर ऑब्जेक्ट से मूल्य प्राप्त करने के लिए हमें या तो लूप के लिए ऑब्जेक्ट का उपयोग करना होगा या अगले () विधि का उपयोग करना होगा या सूची () का उपयोग करना होगा।
print(next(generator_test())) # will output Hello World
सामान्य फ़ंक्शन v / s जनरेटर फ़ंक्शन को जोड़ने के लिए एक और अंतर यह है कि जब आप एक सामान्य फ़ंक्शन को कॉल करते हैं, तो निष्पादन शुरू हो जाएगा और बंद हो जाएगा जब यह वापस आ जाता है और मूल्य कॉलर को वापस कर दिया जाता है। इसलिए जब निष्पादन शुरू होता है तो आप सामान्य फ़ंक्शन को बीच में नहीं रोक सकते हैं और यह केवल तभी रुकेगा जब यह रिटर्न कीवर्ड पर आएगा।
लेकिन जनरेटर फ़ंक्शन के मामले में एक बार निष्पादन शुरू होने पर यह पहली उपज प्राप्त करता है यह निष्पादन को रोक देता है और जनरेटर ऑब्जेक्ट को वापस देता है। आप मान और भी प्राप्त करने के लिए जनरेटर ऑब्जेक्ट का उपयोग कर सकते हैं, और अपनी आवश्यकता के अनुसार वापस रोक सकते हैं और फिर से शुरू कर सकते हैं।
जनरेटर से मूल्यों को कैसे पढ़ें?
आप एक सूची (), फॉर-लूप और अगली () विधि का उपयोग करके एक जनरेटर ऑब्जेक्ट से मूल्यों को पढ़ सकते हैं।
उपयोग करना: सूची ()
एक सूची एक चलने योग्य वस्तु है जिसमें ब्रैकेट के अंदर इसके तत्व हैं। जेनरेटर ऑब्जेक्ट पर सूची () की सूची जनरेटर के मान को सभी मान देगा।
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(list(num))
आउटपुट:
[0, 2, 4, 6, 8]
का उपयोग कर: के लिए में
उदाहरण में, सम्मिलित समरूप_अनुसंधान () है जो आपको n परिभाषित के लिए सभी सम संख्याएँ देगा। फ़ंक्शन इवन_एनआरएस () पर कॉल एक जनरेटर ऑब्जेक्ट लौटाएगा, जिसका उपयोग लूप के लिए किया जाता है।
उदाहरण:
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)
आउटपुट:
02468
अगला () का उपयोग करना
अगली () विधि आपको सूची, सरणी या ऑब्जेक्ट में अगला आइटम देगी। एक बार सूची खाली होने के बाद, और यदि अगला () कहा जाता है, तो यह रोक त्रुटि संकेत के साथ एक त्रुटि देगा। यह त्रुटि, अगले से () इंगित करती है कि सूची में अधिक आइटम नहीं हैं।
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))
आउटपुट:
02468Traceback (most recent call last):File "main.py", line 11, inprint(next(num))StopIteration
जनरेटर एक बार उपयोग कर रहे हैं
जनरेटर का उपयोग वे केवल एक बार उपयोग के लिए उपलब्ध हैं। यदि आप उन्हें फिर से उपयोग करने की कोशिश करते हैं, तो यह खाली हो जाएगा।
उदाहरण के लिए:
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)print("\n")print("Calling the generator again: ", list(num))
आउटपुट:
02468Calling the generator again: []
यदि आप चाहते हैं कि आउटपुट फिर से उपयोग किया जाए, तो आपको फिर से कार्य करने के लिए कॉल करना होगा।
उदाहरण: फाइबोनैचि श्रृंखला के लिए जनरेटर और उपज
निम्नलिखित उदाहरण से पता चलता है कि पायथन में जनरेटर और उपज का उपयोग कैसे करें। उदाहरण फाइबोनैचि श्रृंखला उत्पन्न करेगा।
def getFibonnaciSeries(num):c1, c2 = 0, 1count = 0while count < num:yield c1c3 = c1 + c2c1 = c2c2 = c3count += 1fin = getFibonnaciSeries(7)print(fin)for i in fin:print(i)
आउटपुट:
0112358
उदाहरण: यील्ड के साथ कॉलिंग फ़ंक्शन
इस उदाहरण में देखेंगे कि पैदावार के साथ एक फ़ंक्शन को कैसे कॉल किया जाए।
नीचे दिए गए उदाहरण में एक फ़ंक्शन है जिसे टेस्ट () कहा जाता है जो दिए गए नंबर के वर्ग को लौटाता है। एक अन्य फ़ंक्शन है जिसे getSquare () कहा जाता है जो उपज कीवर्ड के साथ परीक्षण () का उपयोग करता है। आउटपुट दी गई संख्या सीमा के लिए वर्ग मान देता है।
def test(n):return n*ndef getSquare(n):for i in range(n):yield test(i)sq = getSquare(10)for i in sq:print(i)
आउटपुट:
0149162536496481
पायथन में रिटर्न के बजाय यील्ड का उपयोग कब करें
Python3 Yield कीवर्ड एक जनरेटर को कॉलर को लौटाता है और कोड का निष्पादन तभी शुरू होता है जब जनरेटर को पुनरावृत्त किया जाता है।
एक वापसी एक समारोह में समारोह निष्पादन का अंत है, और एक एकल मूल्य वापस फोन करने वाले को दिया जाता है।
यहां, वह स्थिति है जब आपको रिटर्न के बजाय यील्ड का उपयोग करना चाहिए
- जब डेटा का आकार बड़ा हो तो रिटर्न के बजाय उपज का उपयोग करें
- जब आप अपने निष्पादन को बड़े डेटा सेट पर तेज़ करना चाहते हैं, तो यील्ड सबसे अच्छा विकल्प है
- जब आप कॉलिंग फ़ंक्शन के लिए मानों का एक बड़ा सेट वापस करना चाहते हैं तो उपज का उपयोग करें
- उपज डेटा का एक प्रभावी तरीका है जो बड़ा या अनंत है।
यील्ड बनाम रिटर्न
यहाँ, यील्ड और रिटर्न के बीच अंतर हैं
प्राप्ति | वापसी |
यील्ड कॉल करने वाले को एक जेनरेटर ऑब्जेक्ट लौटाता है, और कोड का निष्पादन तभी शुरू होता है जब जनरेटर को पुनरावृत्त किया जाता है। | किसी फ़ंक्शन में वापसी फ़ंक्शन निष्पादन का अंत है, और कॉलर को एक एकल मान वापस दिया जाता है। |
जब फ़ंक्शन को कॉल किया जाता है और यह उपज कीवर्ड का सामना करता है, तो फ़ंक्शन निष्पादन बंद हो जाता है। यह फोन करने वाले को वापस जेनरेटर ऑब्जेक्ट लौटाता है। फ़ंक्शन निष्पादन तभी शुरू होगा जब जनरेटर ऑब्जेक्ट निष्पादित हो। | जब फ़ंक्शन को कॉल किया जाता है, तो निष्पादन शुरू होता है और कॉल कीवर्ड पर वैल्यू दी जाती है यदि रिटर्न कीवर्ड है। फ़ंक्शन के अंदर वापसी फ़ंक्शन निष्पादन के अंत को चिह्नित करता है। |
उपज अभिव्यक्ति | वापसी की अभिव्यक्ति |
जब उपज कीवर्ड का उपयोग किया जाता है तो कोई मेमोरी का उपयोग नहीं किया जाता है। | मेमोरी को लौटाए गए मान के लिए आवंटित किया गया है। |
बहुत उपयोगी है अगर आपको विशाल डेटा आकार से निपटना है क्योंकि मेमोरी का उपयोग नहीं किया जाता है। | बहुत छोटे डेटा आकार के लिए सुविधाजनक है। |
यदि उपज कीवर्ड का उपयोग बड़े डेटा आकार के लिए किया जाता है, तो प्रदर्शन बेहतर होता है। | यदि डेटा आकार बहुत बड़ा है तो मेमोरी का बहुत उपयोग किया जाता है जो प्रदर्शन में बाधा उत्पन्न करेगा। |
बड़े डेटा आकार के लिए उपज के मामले में निष्पादन का समय तेज है। | उपयोग किए गए निष्पादन का समय अधिक है क्योंकि यदि आपके डेटा का आकार बहुत बड़ा है, तो यह अतिरिक्त प्रसंस्करण है, यह छोटे डेटा आकार के लिए ठीक काम करेगा। |
सारांश:
- अजगर में उपज कीवर्ड एकमात्र अंतर के साथ वापसी की तरह काम करता है, क्योंकि मूल्य वापस करने के बजाय, यह कॉलर को एक जनरेटर फ़ंक्शन वापस देता है।
- एक जनरेटर एक विशेष प्रकार का पुनरावृत्ति है, जो एक बार उपयोग करने के बाद दोबारा उपलब्ध नहीं होगा। मान स्मृति में संग्रहीत नहीं होते हैं और केवल तब ही उपलब्ध होते हैं जब इन्हें कॉल किया जाता है।
- जनरेटर से मूल्यों को सूची, () और अगले () विधि का उपयोग करके पढ़ा जा सकता है।
- उपज और वापसी के बीच मुख्य अंतर यह है कि उपज कॉलर को एक जनरेटर फ़ंक्शन वापस देता है और रिटर्न कॉलर को एक एकल मूल्य देता है।
- यील्ड किसी भी मान को मेमोरी में स्टोर नहीं करता है, और फायदा यह है कि यह डेटा साइज बड़ा होने पर मददगार होता है, क्योंकि कोई भी वैल्यू मेमोरी में स्टोर नहीं होती है।
- बड़े डेटा आकार के लिए वापसी की तुलना में उपज कीवर्ड का उपयोग करने पर प्रदर्शन बेहतर होता है।