Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Python

पायथन में जेनरेटर?

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 तक की संख्या के वर्ग को प्रिंट करने में सक्षम हैं जो कि बड़ी सिस्टम मेमोरी पर कब्जा कर लिया होगा।

उपरोक्त परिदृश्य पर विचार करें, हम अधिक कुशल कार्यक्रम बनाने के लिए अपने दैनिक प्रोग्रामिंग अभ्यास में जनरेटर का उपयोग कर सकते हैं।>


  1. पायथन यील्ड कीवर्ड:एक गाइड

    पायथन यील्ड कीवर्ड का उपयोग कैसे करें पायथन में जेनरेटर सबसे सहज अवधारणा नहीं हैं। मामले को बदतर बनाने के लिए, वे यील्ड नामक एक विशेष कीवर्ड का उपयोग करते हैं, भले ही जनरेटर स्वयं कार्य कर रहे हों। उपज कीवर्ड क्या है? यह रिटर्न स्टेटमेंट की तुलना कैसे करता है? वे अच्छे प्रश्न हैं। इस गाइड में, ह

  1. जावास्क्रिप्ट जेनरेटर

    एक जेनरेटर फंक्शन यील्ड कीवर्ड का उपयोग परिणाम उत्पन्न करने और लौटने के बाद भी अपनी स्थिति बनाए रखने के लिए करता है ताकि अगली बार जब इसे कहा जाए तो यह अंतिम यील्ड रन से तुरंत फिर से शुरू हो सके। जेनरेटर फ़ंक्शन के लिए प्रत्येक कॉल कॉलर को एक मान वापस भेज देगा। जावास्क्रिप्ट में जेनरेटर फ़ंक्शन के ल

  1. issuperset () पायथन में

    इस लेख में, हम पायथन में issuperset() और विभिन्न क्षेत्रों में इसके कार्यान्वयन के बारे में जानेंगे। यह विधि बूलियन ट्रू लौटाती है यदि एक सेट बी के सभी तत्वों में सभी तत्व सेट ए होते हैं जो एक तर्क के रूप में पारित होते हैं और यदि ए के सभी तत्व बी में मौजूद नहीं होते हैं तो झूठा रिटर्न देता है। इस