पायथन इटरेटर कैसे बनाएं: एक गाइड
इटरेटर पायथन में हर जगह हैं; मूल बातें सीखना भी "इटरेटर" या "इटरेबल" शब्द सुने बिना कठिन है।
एक इटरेटर एक ऑब्जेक्ट है जिस पर पुनरावृति की जा सकती है। जबकि कुछ बिल्ट-इन ऑब्जेक्ट्स हैं जिन पर आप पुनरावृति कर सकते हैं, आप अपने स्वयं के भी परिभाषित कर सकते हैं।
इस गाइड में, हम पायथन इटरेटर्स के बारे में बात करेंगे, वे कैसे काम करते हैं, और आप उन्हें अपने कोड में कैसे उपयोग कर सकते हैं। हम अपना स्वयं का इटरेटर बनाएंगे ताकि आप उनकी मुख्य विशेषताओं को क्रिया में देख सकें। इस गाइड में कोड पायथन 3.x इंस्टॉलेशन के लिए संगत है।
आइए शुरू करते हैं!
इटरेटर क्या है?
इटरेटर वे ऑब्जेक्ट्स हैं जिन पर आप पुनरावृति कर सकते हैं। एक इटरेटर उस ऑब्जेक्ट से डेटा लौटाएगा, एक समय में एक आइटम।
आप किसी ऑब्जेक्ट को फॉर लूप के माध्यम से चलाकर जांच सकते हैं कि वह इटरेबल है या नहीं; यदि आप ऑब्जेक्ट के माध्यम से लूप कर सकते हैं, तो इसका मतलब है कि यह इटरेबल है। स्ट्रिंग्स, सूचियाँ, टपल्स, और डिक्शनरीज़ उन बिल्ट-इन डेटा प्रकारों के उदाहरण हैं जो इटरेबल ऑब्जेक्ट्स हैं।
पायथन में एक इटरेटर ऑब्जेक्ट में दो मेथड्स होने चाहिए:
__iter__(): यह आपको एक इटरेटर पुनः प्राप्त करने की अनुमति देता है।__next__(): यह आपको इटरेटर में अगला मान प्राप्त करने की अनुमति देता है।
__ अंडरस्कोर का उपयोग इटरेटर्स में किया जाता है क्योंकि वे विशेष फंक्शन को दर्शाते हैं। एक इटरेटर को परिभाषित करने के लिए, आपको इन दो विशेष फंक्शन का उपयोग करना होगा। साथ में, उन्हें इटरेटर प्रोटोकॉल कहा जाता है। इन मेथड्स को आमतौर पर "इटर और नेक्स्ट मेथड्स" के रूप में उच्चारित किया जाता है।
अनंत इटरेटर कैसे बनाएं
हम मूल बातों से शुरू करेंगे: एक अनंत इटरेटर बनाना। यह इटरेटर का सबसे सरल प्रकार है। यह इतना सरल है कि यह हमेशा के लिए चलता रहेगा। हम इसे ट्यूटोरियल में बाद में ठीक करेंगे।
आइए Cakes नामक एक क्लास को परिभाषित करके शुरू करते हैं, जो हमारी इटरेटर क्लास होगी:
class Cakes:
def __init__(self, value):
self.value = value
हमने एक __init__ मेथड घोषित किया है जो हमारे क्लास के ऑब्जेक्ट के इंस्टेंटिएट होते ही निष्पादित होगा। __init__ मेथड को कंस्ट्रक्टर कहा जाता है। इस उदाहरण में, हमारा __init__ मेथड एक मान ले सकता है: value।
अब, हम अपना इटरेटर प्रोटोकॉल बनाने जा रहे हैं:
def __iter__(self):
return self
def __next__(self):
return self.value
__iter__ मेथड का उपयोग हमारे इटरेटर ऑब्जेक्ट को पुनः प्राप्त करने के लिए किया जाता है। __next__ मेथड हमें हमारे द्वारा निर्दिष्ट इटरेबल ऑब्जेक्ट में अगला मान पुनः प्राप्त करने की अनुमति देता है।
आइए सुनिश्चित करें कि हमारा कोड अब तक काम करता है। हम एक ऑब्जेक्ट को अपने क्लास की तरह परिभाषित करके ऐसा करेंगे:
cake = Cakes(["Vanilla Sponge"])
अब तक, सब अच्छा! आप सोच रहे होंगे: यह कोड कुछ क्यों नहीं कर रहा है? ऐसा इसलिए है क्योंकि हमारा क्लास केवल एक इटरेटर फंक्शन लौटाता है।
हमें अपने इटरेटर पर पुनरावृति करनी होगी यह जांचने के लिए कि यह काम करता है। हम फॉर-इन लूप का उपयोग करके ऐसा कर सकते हैं:
for c in cake:
print(c)
हमारा कोड लौटाता है:
Vanilla Sponge Vanilla Sponge ...
वेनिला स्पंज का अभिशाप! यह कंसोल पर प्रिंट होता रहता है। क्या हो रहा है? हमने अभी अपना पहला इटरेटर बनाया है। यह बहुत सरल है, लेकिन यह काम करता है।
पायथन में फॉर-इन लूप का उपयोग करके इटरेटर्स का परीक्षण
इससे पहले कि हम अपने इटरेटर को उपयोगी बनाएं, आइए फॉर-इन लूप की अवधारणा को संशोधित करने के लिए एक क्षण लें। हमारे पिछले उदाहरण में, हमने अपने कोड का परीक्षण करने के लिए एक फॉर-इन लूप लिखा:
for c in cake:
print(c)
फॉर-इन लूप जिस तरह से काम करता है वह यह है कि यह पहले __iter__() मेथड का उपयोग करके एक ऑब्जेक्ट का इटरेटर बनाता है। एक फॉर-इन लूप तब तक __next__() को कॉल करता है जब तक कोई मान नहीं लौटाया जाता।
आप for-in लूप को एक सरल while लूप के रूप में सोच सकते हैं। जब तक ऐसे मान हैं जो एक इटरेटर लौटा सकता है, एक फॉर-इन लूप उन मानों को लौटाएगा।
एक उपयोगी इटरेटर बनाना
हमारा पिछला इटरेटर बहुत उपयोगी नहीं है। यह केवल बार-बार एक ही मान प्रिंट करता है। उस ने कहा, यह अभी भी एक इटरेटर है: यह एक इटरेबल में सभी ऑब्जेक्ट्स को पढ़ने में सक्षम है।
हम एक इटरेटर बनाने जा रहे हैं जो पायथन ऐरे पर पुनरावृति करता है। इस ऐरे में केक की एक सूची होती है।
अपने इटरेटर को अनंत रूप से दोहराने से रोकने के लिए, हम ट्रैक रखने जा रहे हैं कि हमारे इटरेबल में कितने मान हैं, और हमारे इटरेटर ने कितनी बार निष्पादित किया है। यह हमें अपने इटरेटर को तब रोकने की अनुमति देगा जब उसने सूची में सभी आइटम्स पर पुनरावृति कर ली हो।
एक नई पायथन फ़ाइल खोलें और निम्न कोड पेस्ट करें:
class Cakes:
def __init__(self, value):
self.value = value
self.max = len(value)
self.count = 0
def __iter__(self):
return self
def __next__(self):
if self.count < self.max:
to_return = self.value[self.count]
self.count += 1
return to_return
else:
raise StopIteration
यह इटरेटर हमारे पिछले वाले से थोड़ा अधिक जटिल है। इसीलिए हमने पहले एक अनंत इटरेटर बनाया। इस इटरेटर में, हमने तीन मानों को इनिशियलाइज़ किया है:
- value: वह आइटम जिस पर हम पुनरावृति करना चाहते हैं।
- max: हमारे इटरेबल में आइटम्स की संख्या।
- count: हमारे इटरेटर ने कितनी बार निष्पादित किया है।
हमारे __next__() मेथड में, हमने एक "if" स्टेटमेंट जोड़ा है। यह स्टेटमेंट जांचता है कि हमारे इटरेटर के चलने की संख्या (count) हमारे इटरेबल पर पुनरावृति करने वाले आइटम्स की संख्या (max) से कम है या नहीं।
यदि "count" "max" से कम है, तो हमारा इटरेटर इटरेबल ऑब्जेक्ट में अगला मान ढूंढेगा। यह तब हमारे "count" वेरिएबल में 1 जोड़ेगा ताकि हम ट्रैक रख सकें कि कितने ऑब्जेक्ट्स पुनरावृति के लिए बचे हैं। फिर, हम उस मान को लौटाते हैं जिसकी हमने गणना की थी।
यह ध्यान रखना महत्वपूर्ण है कि हम "count" वेरिएबल को बढ़ाने से पहले "to_return" वेरिएबल को एक मान असाइन करते हैं। यह सुनिश्चित करता है कि हम अपने इटरेटर की वर्तमान पुनरावृति पर मान को एक्सेस कर सकते हैं।
यदि हमने अपनी सूची में हर आइटम पर पुनरावृति कर ली है, तो StopIteration नामक एक अपवाद उठाया जाएगा। यह हमारे प्रोग्राम को रोक देता है एक बार जब हम सूची में हर आइटम पर पुनरावृति कर लेते हैं।
आइए देखें कि हमारा इटरेटर काम करता है। निम्न कोड को अपने मेन प्रोग्राम में जोड़ें और इसे निष्पादित करें:
cake = Cakes(["Vanilla Sponge"])
for c in cake:
print(c)
हमारा कोड लौटाता है:
Vanilla Sponge
आइए अपनी सूची में कुछ और आइटम जोड़ें और देखें क्या होता है:
cake = Cakes(["Vanilla Sponge", "Carrot", "Coffee"])
for c in cake:
print(c)
हमारा कोड लौटाता है:
Vanilla Sponge Carrot Coffee
हमने कर दिखाया! हमने सफलतापूर्वक एक इटरेटर बनाया है जो हमारे केक की सूची के माध्यम से लूप करता है। इस तक पहुंचने के लिए आप एक केक - या कम से कम एक कपकेक - के हकदार हैं।
निष्कर्ष
इटरेटर आपको ऐसे ऑब्जेक्ट्स बनाने की अनुमति देते हैं जिन पर पुनरावृति की जा सके। एक इटरेटर एक सूची, एक स्ट्रिंग, या किसी अन्य इटरेबल ऑब्जेक्ट के माध्यम से लूप कर सकता है, और एक विशेष क्रिया कर सकता है।
क्या आप एक चुनौती के लिए तैयार हैं? एक इटरेटर बनाएं जो संख्याओं की एक सूची के माध्यम से लूप करता है और प्रत्येक संख्या को दो से गुणा करके लौटाता है।
इस इटरेटर का कोड हमारे ऊपर के उदाहरण के समान होगा - यह अभी भी इटरेटर प्रोटोकॉल का उपयोग करेगा - लेकिन इसे मेन प्रोग्राम में लौटाए जाने से पहले सूची में प्रत्येक संख्या को दो से गुणा करना चाहिए।
अब आप पायथन में अपने स्वयं के इटरेटर्स को एक विशेषज्ञ की तरह लिखना शुरू करने के लिए तैयार हैं!