उपज में Python ट्यूटोरियल: Generator & उपज बनाम रिटर्न उदाहरण

एचएमबी क्या है? Python उपज?

पायथन में yield कीवर्ड केवल return की तरह काम करता है

अंतर यह है कि मान लौटाने के बजाय, यह कॉलर को एक जेनरेटर ऑब्जेक्ट देता है।

जब किसी फ़ंक्शन को कॉल किया जाता है और निष्पादन का थ्रेड फ़ंक्शन में yield कीवर्ड पाता है, तो फ़ंक्शन निष्पादन उस पंक्ति पर ही रुक जाता है और यह कॉलर को एक जनरेटर ऑब्जेक्ट वापस लौटा देता है।

वाक्य - विन्यास

yield expression

विवरण

Python yield एक जनरेटर ऑब्जेक्ट लौटाता है. Generators विशेष फ़ंक्शन हैं जिन्हें मान प्राप्त करने के लिए दोहराया जाना चाहिए।

यील्ड कीवर्ड दिए गए एक्सप्रेशन को जेनरेटर फ़ंक्शन में बदल देता है जो जेनरेटर ऑब्जेक्ट को वापस देता है। ऑब्जेक्ट के मान प्राप्त करने के लिए, इसे यील्ड को दिए गए मानों को पढ़ने के लिए पुनरावृत्त करना होगा।

उदाहरण: उपज विधि

यहाँ यील्ड का एक सरल उदाहरण दिया गया है। फ़ंक्शन testyield() में यील्ड कीवर्ड है, जिसका स्ट्रिंग है "Guru99 में आपका स्वागत है Python ट्यूटोरियल“. जब फ़ंक्शन को कॉल किया जाता है, तो आउटपुट प्रिंट होता है और यह वास्तविक मान के बजाय एक जनरेटर ऑब्जेक्ट देता है।

def testyield():
  yield "Welcome to Guru99 Python Tutorials"
output = testyield()
print(output)

आउटपुट:

<generator object testyield at 0x00000028265EB9A8>

दिया गया आउटपुट एक जेनरेटर ऑब्जेक्ट है, जिसमें वह मान है जो हमने यील्ड को दिया है।

लेकिन हमें वह संदेश नहीं मिल रहा है जो हमें उत्पादन बढ़ाने के लिए दिया जाना चाहिए!

यील्ड को दिए गए संदेश को प्रिंट करने के लिए जेनरेटर ऑब्जेक्ट को पुनरावृत्त करना होगा जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है:

def testyield():
  yield "Welcome to Guru99 Python Tutorials"

output = testyield()
for i in output:
    print(i)

आउटपुट:

Welcome to Guru99 Python Tutorials

क्या हैं Generatorएस में Python?

Generators ऐसे फ़ंक्शन हैं जो एक पुनरावृत्त जनरेटर ऑब्जेक्ट लौटाते हैं। जनरेटर ऑब्जेक्ट से मान पूरी सूची के बजाय एक-एक करके प्राप्त किए जाते हैं और इसलिए वास्तविक मान प्राप्त करने के लिए आप next() या list() विधि का उपयोग करके for-loop का उपयोग कर सकते हैं।

का प्रयोग Generator समारोह

आप जनरेटर फ़ंक्शन और जनरेटर अभिव्यक्ति का उपयोग करके जनरेटर बना सकते हैं।

जेनरेटर फ़ंक्शन एक सामान्य फ़ंक्शन की तरह होता है, रिटर्न वैल्यू के बजाय इसमें यील्ड कीवर्ड होता है।

जनरेटर फ़ंक्शन बनाने के लिए आपको एक yield कीवर्ड जोड़ना होगा। निम्न उदाहरण दिखाता है कि जनरेटर फ़ंक्शन कैसे बनाया जाता है।

def generator():
    yield "H"
    yield "E"
    yield "L"
    yield "L"
    yield "O"

test = generator()
for i in test:
    print(i)

आउटपुट:

H
E
L
L
O

सामान्य कार्य बनाम सामान्य कार्य के बीच अंतर Generator समारोह.

आइये समझते हैं कि जेनरेटर फ़ंक्शन सामान्य फ़ंक्शन से किस प्रकार भिन्न है।

इसमें दो फ़ंक्शन हैं normal_test() और generator_test().

दोनों फंक्शन को “Hello World” स्ट्रिंग वापस लौटाना है। normal_test() return का उपयोग कर रहा है और generator_test() yield का उपयोग कर रहा है।

# Normal function
def normal_test():
    return "Hello World"
	
#Generator function
def generator_test():
	yield "Hello World"
print(normal_test()) #call to normal function
print(generator_test()) # call to generator function

आउटपुट:

Hello World
<generator object generator_test at 0x00000012F2F5BA20>

आउटपुट दिखाता है कि जब आप सामान्य फ़ंक्शन normal_test() को कॉल करते हैं तो यह Hello World स्ट्रिंग लौटाता है। Yield कीवर्ड वाले जनरेटर फ़ंक्शन के लिए यह लौटाता है और स्ट्रिंग नहीं.

यह जनरेटर फ़ंक्शन और सामान्य फ़ंक्शन के बीच मुख्य अंतर है। अब जनरेटर ऑब्जेक्ट से मान प्राप्त करने के लिए हमें या तो for loop के अंदर ऑब्जेक्ट का उपयोग करना होगा या next() विधि का उपयोग करना होगा या list() का उपयोग करना होगा।

print(next(generator_test()))  # will output Hello World

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

लेकिन जनरेटर फ़ंक्शन के मामले में जब एक बार निष्पादन शुरू हो जाता है, तो जब उसे पहला यील्ड मिलता है, तो यह निष्पादन को रोक देता है और जनरेटर ऑब्जेक्ट को वापस देता है। आप अपनी ज़रूरत के हिसाब से मान प्राप्त करने और रोकने और फिर से शुरू करने के लिए जनरेटर ऑब्जेक्ट का उपयोग कर सकते हैं।

जनरेटर से मान कैसे पढ़ें?

आप list(), for-loop और next() विधि का उपयोग करके जनरेटर ऑब्जेक्ट से मान पढ़ सकते हैं।

उपयोग: सूची()

सूची एक पुनरावृत्तीय ऑब्जेक्ट है, जिसके तत्व कोष्ठक के अंदर होते हैं। जनरेटर ऑब्जेक्ट पर list() का उपयोग करने से जनरेटर द्वारा रखे गए सभी मान प्राप्त हो जाएंगे।

def even_numbers(n):
    for x in range(n):
       if (x%2==0): 
           yield x       
num = even_numbers(10)
print(list(num))

आउटपुट:

[0, 2, 4, 6, 8]

उपयोग: for-in

उदाहरण में, even_numbers() नामक एक फ़ंक्शन परिभाषित है जो आपको n परिभाषित के लिए सभी सम संख्याएँ देगा। even_numbers() फ़ंक्शन को कॉल करने से एक जनरेटर ऑब्जेक्ट वापस आएगा, जिसका उपयोग for-loop के अंदर किया जाता है।

उदाहरण:

def even_numbers(n):
    for x in range(n):
       if (x%2==0): 
           yield x       
num = even_numbers(10)
for i in num:
    print(i)

आउटपुट:

0
2
4
6
8

next() का उपयोग करना

next() विधि आपको सूची, सरणी या ऑब्जेक्ट में अगला आइटम देगी। एक बार सूची खाली हो जाने पर, और यदि next() को कॉल किया जाता है, तो यह stopIteration सिग्नल के साथ एक त्रुटि वापस देगा। next() से यह त्रुटि यह संकेत देती है कि सूची में कोई और आइटम नहीं है।

def even_numbers(n):
    for x in range(n):
       if (x%2==0): 
           yield x       
num = even_numbers(10)
print(next(num))
print(next(num))
print(next(num))
print(next(num))
print(next(num))
print(next(num))

आउटपुट:

0
2
4
6
8
Traceback (most recent call last):
  File "main.py", line 11, in <module>
    print(next(num))
StopIteration

Generatorये एक बार उपयोग के लिए हैं

जनरेटर के मामले में वे केवल एक बार उपयोग के लिए उपलब्ध हैं। यदि आप उन्हें दोबारा उपयोग करने का प्रयास करेंगे, तो वे खाली हो जाएंगे।

उदाहरण के लिए:

def even_numbers(n):
    for x in range(n):
       if (x%2==0): 
           yield x       
num = even_numbers(10)
for i in num:
    print(i)

print("\n")
print("Calling the generator again: ", list(num))

आउटपुट:

0
2
4
6
8
Calling the generator again:  []

यदि आप चाहते हैं कि आउटपुट का पुनः उपयोग किया जाए तो आपको फ़ंक्शन को पुनः कॉल करना होगा।

उदाहरण: Generatorफिबोनाची श्रृंखला के लिए s और उपज

निम्नलिखित उदाहरण दिखाता है कि जनरेटर और उपज का उपयोग कैसे करें Pythonयह उदाहरण फिबोनाची श्रृंखला उत्पन्न करेगा।

def getFibonnaciSeries(num):
    c1, c2 = 0, 1
    count = 0
    while count < num:
        yield c1
        c3 = c1 + c2
        c1 = c2
        c2 = c3
        count += 1
fin = getFibonnaciSeries(7)
print(fin)
for i in fin:
    print(i)

आउटपुट:

<generator object getFibonnaciSeries at 0x0000007F39C8BA20>
0
1
1
2
3
5
8

उदाहरण: यील्ड के साथ फ़ंक्शन कॉल करना

इस उदाहरण में देखेंगे कि यील्ड के साथ फ़ंक्शन को कैसे कॉल किया जाता है।

नीचे दिए गए उदाहरण में test() नामक एक फ़ंक्शन है जो दी गई संख्या का वर्ग लौटाता है। getSquare() नामक एक और फ़ंक्शन है जो yield कीवर्ड के साथ test() का उपयोग करता है। आउटपुट दी गई संख्या सीमा के लिए वर्ग मान देता है।

def test(n):
    return n*n

def getSquare(n):
    for i in range(n):
        yield test(i)

sq = getSquare(10)
for i in sq:
    print(i)

आउटपुट:

0
1
4
9
16
25
36
49
64
81

रिटर्न के स्थान पर यील्ड का प्रयोग कब करें? Python

Python3 उपज कीवर्ड कॉलर को एक जनरेटर लौटाता है और कोड का निष्पादन केवल तभी शुरू होता है जब जनरेटर को पुनरावृत्त किया जाता है।

A वापसी किसी फ़ंक्शन में, फ़ंक्शन निष्पादन का अंत होता है, और कॉलर को एक एकल मान वापस दिया जाता है।

यहाँ वह स्थिति है जब आपको रिटर्न के बजाय यील्ड का उपयोग करना चाहिए

  • जब डेटा का आकार बड़ा हो तो return के बजाय yield का उपयोग करें
  • जब आपको बड़े डेटा सेट पर अपने निष्पादन को तेज़ करने की आवश्यकता होती है तो यील्ड सबसे अच्छा विकल्प है
  • जब आप कॉलिंग फ़ंक्शन को मानों का एक बड़ा सेट लौटाना चाहते हैं तो yield का उपयोग करें
  • यील्ड (उत्पादन) बड़े या अनंत डेटा का उत्पादन करने का एक कुशल तरीका है।

उपज बनाम वापसी

यहाँ, यील्ड और रिटर्न के बीच अंतर हैं

प्राप्ति वापसी
यील्ड कॉलर को एक जेनरेटर ऑब्जेक्ट लौटाता है, और कोड का निष्पादन केवल तभी शुरू होता है जब जेनरेटर को पुनरावृत्त किया जाता है। किसी फ़ंक्शन में रिटर्न, फ़ंक्शन निष्पादन का अंत होता है, तथा कॉलर को एक एकल मान वापस दिया जाता है।
जब फ़ंक्शन को कॉल किया जाता है और उसे yield कीवर्ड मिलता है, तो फ़ंक्शन निष्पादन रुक जाता है। यह जनरेटर ऑब्जेक्ट को कॉलर को वापस लौटाता है। फ़ंक्शन निष्पादन तभी शुरू होगा जब जनरेटर ऑब्जेक्ट निष्पादित हो जाएगा। जब फ़ंक्शन को कॉल किया जाता है, तो निष्पादन शुरू हो जाता है और यदि रिटर्न कीवर्ड है तो कॉलर को मान वापस दे दिया जाता है। फ़ंक्शन के अंदर रिटर्न फ़ंक्शन निष्पादन के अंत को चिह्नित करता है।
उपज अभिव्यक्ति वापसी अभिव्यक्ति
जब yield कीवर्ड का उपयोग किया जाता है तो कोई मेमोरी का उपयोग नहीं होता है। लौटाए गए मान के लिए मेमोरी आवंटित की जाती है।
यदि आपको विशाल डेटा आकार से निपटना है तो यह बहुत उपयोगी है क्योंकि मेमोरी का उपयोग नहीं किया जाता है। बहुत छोटे डेटा आकार के लिए सुविधाजनक.
यदि बड़े डेटा आकार के लिए yield कीवर्ड का उपयोग किया जाए तो प्रदर्शन बेहतर होता है। यदि डेटा का आकार बड़ा है तो बहुत अधिक मेमोरी का उपयोग होगा जिससे प्रदर्शन पर असर पड़ेगा।
बड़े आकार के डेटा के मामले में निष्पादन समय तेज होता है। इसमें निष्पादन समय अधिक लगता है, क्योंकि यदि आपका डेटा आकार बड़ा है तो अतिरिक्त प्रसंस्करण करना पड़ता है, यह छोटे डेटा आकार के लिए भी ठीक काम करेगा।

सारांश

  • पायथन में yield कीवर्ड return की तरह काम करता है, अंतर केवल इतना है कि यह मान लौटाने के बजाय, कॉलर को एक जनरेटर फ़ंक्शन देता है।
  • जनरेटर एक विशेष प्रकार का इटरेटर है जो एक बार इस्तेमाल होने के बाद दोबारा उपलब्ध नहीं होगा। मान मेमोरी में संग्रहीत नहीं होते हैं और केवल कॉल किए जाने पर ही उपलब्ध होते हैं।
  • जनरेटर से मान for-in, list() और next() विधि का उपयोग करके पढ़े जा सकते हैं।
  • यील्ड और रिटर्न के बीच मुख्य अंतर यह है कि यील्ड कॉलर को एक जेनरेटर फ़ंक्शन लौटाता है और रिटर्न कॉलर को एक एकल मान देता है।
  • यील्ड किसी भी मान को मेमोरी में संग्रहीत नहीं करता है, और इसका लाभ यह है कि यह तब उपयोगी होता है जब डेटा का आकार बड़ा होता है, क्योंकि कोई भी मान मेमोरी में संग्रहीत नहीं होता है।
  • यदि बड़े डेटा आकार के लिए रिटर्न की तुलना में यील्ड कीवर्ड का उपयोग किया जाए तो प्रदर्शन बेहतर होता है।