yield कीवर्ड जेनरेटर में उपयोग किया जाता है। इसके व्यवहार को समझने के लिए आइए पहले देखें कि इटरेबल्स क्या हैं। Python ऑब्जेक्ट्स लिस्ट, फाइल, स्ट्रिंग आदि को इटरेबल्स कहा जाता है। कोई भी ऑब्जेक्ट जिसे for..in सिंटैक्स का उपयोग करके ट्रैवर्स किया जा सकता है, इटरेबल है। इटरेटर ऑब्जेक्ट भी एक इटरेबल है, लेकिन इसे केवल एक बार इटरेट किया जा सकता है। इटरेटर ऑब्जेक्ट किसी भी इटरेबल से iter() फंक्शन का उपयोग करके प्राप्त किया जा सकता है और इसमें next() मेथड होता है जिसका उपयोग करके इटरेशन किया जाता है।
>>> L1 = [1,2,3,4]
>>> I1 = iter(L1)
>>> while True:
try:
print(next(I1))
except StopIteration:
sys.exit()
जेनरेटर एक फंक्शन के समान दिखाई देता है, लेकिन यह yield कीवर्ड द्वारा इटरेटर में क्रमिक आइटम्स देता है।
जब एक जेनरेटर फंक्शन को कॉल किया जाता है, तो यह फंक्शन के एक्ज़ीक्यूशन को शुरू किए बिना ही एक इटरेटर ऑब्जेक्ट लौटाता है। जब पहली बार next() मेथड कॉल किया जाता है, तो फंक्शन तब तक एक्ज़ीक्यूट होना शुरू होता है जब तक यह yield स्टेटमेंट तक नहीं पहुंच जाता, जो यील्डेड वैल्यू लौटाता है। yield ट्रैक रखता है यानी अंतिम एक्ज़ीक्यूशन को याद रखता है और दूसरा next() कॉल पिछले मान से जारी रहता है।
निम्न उदाहरण फाइबोनैचि श्रृंखला में संख्याओं वाला एक इटरेटर जनरेट करता है। जेनरेटर फंक्शन fibo() को प्रत्येक कॉल पर फाइबोनैचि श्रृंखला में क्रमिक एलिमेंट देता है।
import sys
def fibo(n):
a,b = 0,1
while True:
if a > n:
return
yield a
a, b = b, a+b
f = fibo(20)
while True:
try:
print(next(f))
except StopIteration:
sys.exit()