PEP 255 के साथ पेश किए जाने के बाद से जेनरेटर अजगर का एक महत्वपूर्ण हिस्सा रहे हैं।
पायथन में जेनरेटर विशेष रूटीन हैं जिनका उपयोग लूप के पुनरावृत्ति व्यवहार को नियंत्रित करने के लिए किया जा सकता है। एक जनरेटर एक सरणी लौटने वाले फ़ंक्शन के समान है। एक जनरेटर में पैरामीटर होता है, जिसे हम कॉल कर सकते हैं और यह संख्याओं का एक क्रम उत्पन्न करता है। लेकिन फ़ंक्शंस के विपरीत, जो एक संपूर्ण सरणी लौटाता है, एक जनरेटर एक समय में एक मान उत्पन्न करता है जिसके लिए कम मेमोरी की आवश्यकता होती है।
"यील्ड" कीवर्ड वाले किसी भी पायथन फ़ंक्शन को जनरेटर कहा जा सकता है। एक सामान्य पायथन फ़ंक्शन पहली पंक्ति से निष्पादन शुरू करता है और तब तक जारी रहता है जब तक हमें रिटर्न स्टेटमेंट या फ़ंक्शन का अपवाद या अंत नहीं मिलता है, हालांकि, फ़ंक्शन स्कोप के दौरान बनाए गए स्थानीय चरों में से कोई भी नष्ट हो जाता है और आगे पहुंच योग्य नहीं होता है। जबकि जनरेटर के मामले में जब यह एक उपज कीवर्ड का सामना करता है तो फ़ंक्शन की स्थिति जम जाती है और जनरेटर को फिर से कॉल किए जाने तक सभी चर मेमोरी में संग्रहीत होते हैं।
हम एक पुनरावर्तक के अनुसार जनरेटर का उपयोग कर सकते हैं या "अगला" कीवर्ड का उपयोग करके स्पष्ट रूप से कहा जा सकता है।
आम तौर पर पायथन में जनरेटर:
- def कीवर्ड से परिभाषित
- उपज कीवर्ड का प्रयोग करें
- कई उपज कीवर्ड हो सकते हैं।
- एक पुनरावर्तक देता है।
इटरेटर वाले जेनरेटर
def generator_thr_iter(): yield 'xyz' yield 246 yield 40.50 for i in generator_thr_iter(): print(i)
आउटपुट
xyz 246 40.5
अगले का उपयोग कर जेनरेटर
def generator_thr_iter(): yield 'xyz' yield 246 yield 40.50 >>> g = generator_thr_iter() >>> g.__next__() 'xyz' >>> g.__next__() 246 >>> g.__next__() 40.5 >>> g.__next__() Traceback (most recent call last): File "<pyshell#39>", line 1, in <module> g.__next__() StopIterationमें
हम जनरेटर के बारे में सोच सकते हैं कि एक बार में सभी के बजाय एक से अधिक आइटम लौटाते हैं और अगले आइटम का अनुरोध होने तक जेनरेटर फ़ंक्शन को रोक दिया जाता है।
1 से n तक की संख्याओं के वर्ग को प्रिंट करने का कार्यक्रम
मान लें कि हम 1 से n तक की संख्या के वर्ग की गणना करना चाहते हैं, जहां n वास्तव में बड़ी संख्या है, जैसे कि 'n' तक की संख्याओं की सूची बनाने से पूरे सिस्टम मेमोरी स्पेस पर कब्जा हो जाएगा।
जनरेटर के बिना, हमारा दृष्टिकोण कुछ ऐसा होगा -
>>> n= 200000000000 >>> number_list = range(1, n+1) >>> for i in number_list: print(i*i)
उपरोक्त दृष्टिकोण बहुत सारी सिस्टम मेमोरी का उपभोग करेगा। बेहतर तरीका यह होगा कि संख्याओं की सूची बनाए बिना संख्याओं पर पुनरावृति की जाए ताकि सिस्टम मेमोरी पर कब्जा न हो। यहाँ जनरेटर का उपयोग आता है।
इसके लिए हमारा जेनरेटर प्रोग्राम होगा -
def num_generator(n): num =1 while True: yield num if num == n: return else: num += 1 for i in num_generator(200000000000): print (i*i)
तो उपरोक्त दृष्टिकोण में, जब लूप के लिए पहली बार इनिशियलाइज़ किया जाता है तो num_generator को कॉल किया जाता है और n =200000000000 का मान मेमोरी में संग्रहीत किया जाता है और num =1 को इनिशियलाइज़ किया जाता है और लूप में प्रवेश किया जाता है जो हमेशा के लिए लूप होता है। फिर उपज संख्या का सामना करना पड़ता है, इस समय लूप जमे हुए है और सभी स्थानीय चर स्मृति में संग्रहीत हैं। चूंकि num=1, यील्ड नंबर लूप के लिए वापस आ जाता है और I को असाइन किया जाता है, जहां 1(i*i) प्रिंट किया जाता है और num_generator को अगला कॉल किया जाता है।
अब निष्पादन उस बिंदु से शुरू होता है जहां यह पहले जम गया है, इसलिए यह लाइन num ==n (1 ==200000000000) को निष्पादित करता है, जो कि गलत है इसलिए num +=1 निष्पादित किया जाता है जो num =2 पर आता है और जबकि लूप है एक बार फिर से निष्पादित और प्रक्रिया जारी है।
अंत में जबकि लूप को n=200000000000 तक निष्पादित किया जाता है, जब 200000000000 प्राप्त होता है तो अगली पंक्ति 'num ==n'(200000000000 ==200000000000) निष्पादित की जाती है, क्योंकि यह सच है कि रिटर्न स्टेटमेंट निष्पादित किया जाता है।
इसलिए जब जनरेटर रिटर्न स्टेटमेंट निष्पादित करता है या अपवाद का सामना करता है या जनरेटर के अंत तक पहुंच जाता है तो "स्टॉपइटरेशन" अपवाद उठाया जाता है और लूप के लिए पुनरावृत्ति इस समय बंद हो जाती है। तो ऊपर हम संख्याओं की एक बड़ी सूची बनाए बिना 200000000000 तक की संख्या के वर्ग को प्रिंट करने में सक्षम हैं जो कि बड़ी सिस्टम मेमोरी पर कब्जा कर लिया होगा।
उपरोक्त परिदृश्य पर विचार करें, हम अधिक कुशल कार्यक्रम बनाने के लिए अपने दैनिक प्रोग्रामिंग अभ्यास में जनरेटर का उपयोग कर सकते हैं।>