पायथन जेनरेटर और इटरेटर्स की व्याख्या
पायथन में, डेटा के अनुक्रमों को कुशलतापूर्वक संभालने के लिए इटरेटर और जेनरेटर आवश्यक हैं। वे पूरे डेटासेट को मेमोरी में संग्रहीत किए बिना डेटा पर पुनरावृति करने का एक तरीका प्रदान करते हैं। यह विशेष रूप से बड़े डेटा सेट या डेटा की धाराओं के साथ काम करते समय उपयोगी होता है। यह लेख बताएगा कि इटरेटर और जेनरेटर क्या हैं, वे कैसे काम करते हैं, और पायथन में उनका उपयोग कैसे करें।
इटरेटर क्या है?
इटरेटर एक ऑब्जेक्ट है जो इटरेटर प्रोटोकॉल को लागू करता है, जिसमें दो विधियाँ शामिल हैं: __iter__()
और __next__()
। __iter__()
विधि इटरेटर ऑब्जेक्ट को ही लौटाती है, और __next__()
विधि अनुक्रम से अगला मान लौटाती है। जब लौटाने के लिए कोई और आइटम नहीं होता है, तो __next__()
यह संकेत देने के लिए StopIteration
अपवाद उठाता है कि पुनरावृत्ति समाप्त होनी चाहिए।
class MyIterator:
def __init__(self, limit):
self.limit = limit
self.count = 0
def __iter__(self):
return self
def __next__(self):
if self.count < self.limit:
self.count += 1
return self.count
else:
raise StopIteration
# Using the iterator
iter_obj = MyIterator(5)
for num in iter_obj:
print(num)
जेनरेटर क्या है?
जनरेटर एक विशेष प्रकार का इटरेटर है जो इटरेटर के निर्माण को सरल बनाता है। जेनरेटर मान लौटाने के बजाय yield
कथन का उपयोग करते हैं। हर बार जब yield
को कॉल किया जाता है, तो फ़ंक्शन की स्थिति सहेज ली जाती है, जिससे इसे वहीं से फिर से शुरू करने की अनुमति मिलती है जहाँ से इसे छोड़ा गया था। जेनरेटर को नियमित फ़ंक्शन का उपयोग करके परिभाषित किया जाता है, लेकिन return
के बजाय yield
के साथ।
def my_generator(limit):
count = 0
while count < limit:
count += 1
yield count
# Using the generator
for num in my_generator(5):
print(num)
इटरेटर्स और जेनरेटर्स की तुलना
यद्यपि इटरेटर्स और जेनरेटर्स दोनों का उपयोग पुनरावृत्ति के लिए किया जाता है, लेकिन उनके कार्यान्वयन और उपयोग में अंतर होता है:
- मेमोरी दक्षता: जेनरेटर इटरेटर्स की तुलना में अधिक मेमोरी कुशल होते हैं क्योंकि वे तत्काल मान उत्पन्न करते हैं और उन्हें मेमोरी में संपूर्ण अनुक्रम संग्रहीत करने की आवश्यकता नहीं होती है।
- उपयोग में आसानी: कस्टम इटरेटर की तुलना में जेनरेटर लिखना और समझना आसान है। उन्हें कम बॉयलरप्लेट कोड की आवश्यकता होती है और वे अधिक संक्षिप्त होते हैं।
- स्टेट प्रबंधन: जेनरेटर स्वचालित रूप से स्टेट प्रबंधन को संभालते हैं और आंतरिक रूप से उनकी प्रगति पर नज़र रखते हैं, जबकि कस्टम इटरेटर्स को स्टेट के स्पष्ट प्रबंधन की आवश्यकता होती है।
जटिल डेटा स्ट्रीम के लिए जेनरेटर का उपयोग करना
जेनरेटर विशेष रूप से जटिल डेटा स्ट्रीम को संभालने के लिए उपयोगी होते हैं, जैसे कि किसी फ़ाइल से लाइनें पढ़ना या बड़े डेटासेट को प्रोसेस करना। यहाँ एक जेनरेटर का उदाहरण दिया गया है जो एक बार में एक फ़ाइल से लाइनें पढ़ता है:
def read_lines(filename):
with open(filename, 'r') as file:
for line in file:
yield line.strip()
# Using the generator to read lines from a file
for line in read_lines('example.txt'):
print(line)
जेनरेटर का संयोजन
आप डेटा को चरणों में प्रोसेस करने के लिए कई जनरेटर को एक साथ जोड़ सकते हैं। ऐसा एक जनरेटर द्वारा दूसरे जनरेटर को कॉल करके किया जाता है। डेटा को प्रोसेस और फ़िल्टर करने के लिए जनरेटर को संयोजित करने का एक उदाहरण यहाँ दिया गया है:
def numbers():
yield 1
yield 2
yield 3
yield 4
yield 5
def even_numbers(gen):
for number in gen:
if number % 2 == 0:
yield number
# Combining generators
for even in even_numbers(numbers()):
print(even)
निष्कर्ष
जेनरेटर और इटरेटर पायथन में शक्तिशाली उपकरण हैं जो कुशल डेटा हैंडलिंग और पुनरावृत्ति को सक्षम करते हैं। उन्हें बनाने और उपयोग करने का तरीका समझने से आपके कोड के प्रदर्शन और पठनीयता में काफी सुधार हो सकता है, खासकर जब बड़े या जटिल डेटासेट के साथ काम करना हो। जेनरेटर और इटरेटर का लाभ उठाकर, आप अधिक कुशल और स्केलेबल पायथन प्रोग्राम लिख सकते हैं।