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

पायथन में जेनरेटर्स

जेनरेटर्स पायथन में एक शक्तिशाली फीचर हैं (PEP 255 से) जो मेमोरी-कुशल इटरेशन सक्षम करते हैं।

जेनरेटर क्या है?

  • def कीवर्ड से परिभाषित फ़ंक्शन जिसमें yield हो।
  • return के बजाय yield मान लौटाता है।
  • कॉल करने पर जेनरेटर ऑब्जेक्ट (इटरेटर) लौटाता है।
  • राज्य (लोकल वेरिएबल्स) yield पर सस्पेंड होता है और अगले कॉल पर रिज्यूम होता है।

बुनियादी उदाहरण

def generator_thru_iter():
    yield 'xyz'
    yield 246
    yield 40.50

# for लूप के साथ (इटरेटर प्रोटोकॉल)
for i in generator_thru_iter():
    print(i)
# xyz
# 246
# 40.5

# next() के साथ मैन्युअल
g = generator_thru_iter()
print(next(g))  # xyz
print(next(g))  # 246
print(next(g))  # 40.5
print(next(g))  # StopIteration अपवाद

जेनरेटर vs नॉर्मल फ़ंक्शन

नॉर्मल फ़ंक्शनजेनरेटर
सभी मान एक साथ कंप्यूट करके लिस्ट लौटाता हैएक समय में एक मान yield करता है
सभी मान मेमोरी में स्टोर होते हैंलेज़ी इवैल्यूएशन: कम मेमोरी
return से समाप्तyield से सस्पेंड, अंत में StopIteration
कॉल पर निष्पादित होता हैकॉल पर जेनरेटर ऑब्जेक्ट लौटाता है, इटरेशन पर निष्पादित

व्यावहारिक उदाहरण: बड़े नंबर्स के वर्ग

समस्या: 1 से 200 बिलियन तक के वर्ग प्रिंट करना - लिस्ट बनाने से मेमोरी ओवरफ्लो।

बिना जेनरेटर (खराब)

n = 200000000000
number_list = range(1, n+1)  # विशाल रेंज ऑब्जेक्ट (पायथन 3 में OK, लेकिन...)
for i in number_list:
    print(i * i)  # फिर भी धीमा

जेनरेटर के साथ (अच्छा)

def num_generator(n):
    num = 1
    while True:
        yield num
        if num == n:
            return
        num += 1

for i in num_generator(200000000000):
    print(i * i)
    # एक समय में एक मान, O(1) मेमोरी

कैसे काम करता है

  1. for लूप जेनरेटर को कॉल करता है → num_generator चलना शुरू करता है।
  2. yield num पर रुकता है, मान लौटाता है, स्टेट फ्रीज होता है।
  3. लूप बॉडी चलती है (print(i*i))।
  4. अगली इटरेशन पर next() कॉल होता है → yield के बाद से जारी रहता है।
  5. num == n होने पर return → StopIteration उठता है, लूप समाप्त।

जेनरेटर एक्सप्रेशन्स

लिस्ट कॉम्प्रिहेंशन जैसा सिंटैक्स लेकिन पैरेंथेसिस के साथ:

# लिस्ट कॉम्प्रिहेंशन (सभी मेमोरी में)
squares_list = [x*x for x in range(10)]

# जेनरेटर एक्सप्रेशन (लेज़ी)
squares_gen = (x*x for x in range(10))
print(next(squares_gen))  # 0
print(next(squares_gen))  # 1

उन्नत: yield from (पायथन 3.3+)

def gen1():
    yield 1
    yield 2

def gen2():
    yield from gen1()
    yield 3

print(list(gen2()))  # [1, 2, 3]

कब उपयोग करें

  • बड़े/अनंत सीक्वेंसेज़।
  • पाइपलाइन प्रोसेसिंग (डेटा स्ट्रीमिंग)।
  • मेमोरी-क्रिटिकल एप्लिकेशन्स।
  • कॉरूटाइन्स/असिंक्रोनस प्रोग्रामिंग का आधार।
  1. - पायथन यील्ड कीवर्ड: एक गाइड

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

  1. JavaScript Generator फंक्शन: yield के साथ स्थिति बनाए रखें JavaScript Generator फंक्शन: yield के साथ स्थिति बनाए रखें

    जेनरेटर फंक्शन (function*) विशेष फंक्शन हैं जिन्हें रोका और फिर से शुरू किया जा सकता है, जिससे वे अपनी स्थिति बनाए रखते हैं। वे yield कीवर्ड का उपयोग करके मान उत्पन्न करते हैं और Iterator प्रोटोकॉल का पालन करते हैं। उदाहरण { const next = Gen.next(); if (!next.done) {

  1. पायथन में issuperset() फंक्शन पायथन में issuperset() फंक्शन

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