पायथन इटरेटर कैसे बनाएं:एक गाइड
पायथन में इटरेटर बिल्कुल हर जगह हैं; "पुनरावर्तक" या "पुनरावृत्तीय" शब्द सुने बिना मूल बातें भी सीखना कठिन है।
एक पुनरावर्तक एक वस्तु है जिसे पुनरावृत्त किया जा सकता है। जबकि कुछ अंतर्निहित वस्तुएं हैं जिन पर आप पुनरावृति कर सकते हैं, आप अपनी खुद की भी परिभाषित कर सकते हैं।
इस गाइड में, हम पायथन इटरेटर्स के बारे में बात करने जा रहे हैं कि वे कैसे काम करते हैं, और आप उन्हें अपने कोड में कैसे उपयोग कर सकते हैं। हम अपने स्वयं के पुनरावर्तक का निर्माण करेंगे ताकि आप कार्रवाई में उनकी मुख्य विशेषताओं के बारे में जान सकें। इस गाइड में कोड पायथन 3.x इंस्टॉलेशन के लिए अनुकूल है।
आइए शुरू करें!
इटरेटर क्या है?
इटरेटर ऐसी वस्तुएं हैं जिन पर आप पुनरावृति कर सकते हैं। एक पुनरावर्तक उस वस्तु से डेटा लौटाएगा, एक समय में एक आइटम।
लूप के माध्यम से इसे चलाने का प्रयास करके आप जांच सकते हैं कि कोई ऑब्जेक्ट चलने योग्य है या नहीं; यदि आप वस्तु के माध्यम से लूप कर सकते हैं, तो इसका मतलब है कि यह चलने योग्य है। स्ट्रिंग्स, सूचियाँ, टुपल्स और डिक्शनरी बिल्ट-इन डेटा प्रकारों के उदाहरण हैं जो चलने योग्य ऑब्जेक्ट हैं।
पायथन में एक पुनरावर्तक वस्तु में दो विधियाँ होनी चाहिए:
__iter__()
:यह आपको एक पुनरावर्तक को पुनः प्राप्त करने की अनुमति देता है।__next__()
:यह आपको एक पुनरावर्तक में अगला मान प्राप्त करने की अनुमति देता है।
__
अंडरस्कोर का उपयोग इटरेटर में किया जाता है क्योंकि वे विशेष कार्यों को दर्शाते हैं। एक पुनरावर्तक को परिभाषित करने के लिए, आपको इन दो विशेष कार्यों का उपयोग करना होगा। साथ में, उन्हें इटरेटर प्रोटोकॉल कहा जाता है। इन विधियों को आमतौर पर "इटर और अगली विधियों" के रूप में उच्चारित किया जाता है।
81% प्रतिभागियों ने कहा कि बूटकैंप में भाग लेने के बाद उन्हें अपनी तकनीकी नौकरी की संभावनाओं के बारे में अधिक आत्मविश्वास महसूस हुआ। आज ही एक बूटकैंप से मिलान करें।
बूटकैंप शुरू करने से लेकर अपनी पहली नौकरी खोजने तक, औसत बूटकैंप ग्रेड ने करियर संक्रमण में छह महीने से भी कम समय बिताया।
अनंत इटरेटर कैसे बनाएं
हम बुनियादी बातों से शुरू करेंगे:एक अनंत पुनरावर्तक का निर्माण। यह इटरेटर का सबसे सरल प्रकार है। यह इतना आसान है कि यह हमेशा चलता रहेगा। हम इसे बाद में ट्यूटोरियल में ठीक कर देंगे।
आइए केक नामक एक वर्ग को परिभाषित करके शुरू करें, जो हमारा पुनरावर्तक वर्ग होगा:
class Cakes: def __init__(self, value): self.value = value
हमने एक __init__
. घोषित किया है विधि जिसे हमारी कक्षा की किसी वस्तु के त्वरित होते ही निष्पादित किया जाएगा। __init__
विधि को कंस्ट्रक्टर कहा जाता है। इस उदाहरण में, हमारा __init__
विधि एक मान ले सकती है:मान।
इसके बाद, हम अपना इटरेटर प्रोटोकॉल बनाने जा रहे हैं:
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
यह इटरेटर हमारे पिछले वाले की तुलना में थोड़ा अधिक जटिल है। इसलिए हमने पहले एक अनंत इटरेटर बनाया। इस पुनरावर्तक में, हमने तीन मान प्रारंभ किए हैं:
- मान:वह आइटम जिस पर हम पुनरावृति करना चाहते हैं।
- अधिकतम:हमारे चलने योग्य मदों की संख्या।
- गिनती:हमारे पुनरावर्तक ने कितनी बार निष्पादित किया है।
हमारे __next__()
. में विधि, हमने एक "if" कथन जोड़ा है। यह कथन जाँचता है कि क्या हमारे पुनरावर्तक (गिनती) की संख्या उन वस्तुओं की संख्या से कम है, जिन पर हमारे चलने योग्य को पुनरावृति (अधिकतम) करनी चाहिए।
यदि "गिनती" "अधिकतम" से कम है, तो हमारे पुनरावर्तक को पुनरावृत्त वस्तु में अगला मान मिलेगा। फिर यह हमारे "गिनती" चर में 1 जोड़ देगा ताकि हम ट्रैक कर सकें कि कितनी वस्तुओं को फिर से शुरू करना बाकी है। फिर, हम वह मान लौटाते हैं जिसकी हमने गणना की थी।
यह ध्यान रखना महत्वपूर्ण है कि हम "गिनती" चर को बढ़ाने से पहले "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
हमने कर लिया! हमने सफलतापूर्वक एक पुनरावर्तक बनाया है जो हमारे केक की सूची के माध्यम से लूप करता है। आप एक केक के लायक हैं - या यहाँ तक कि सिर्फ एक कपकेक - यहाँ तक पहुँचने के लिए।
निष्कर्ष
इटरेटर आपको ऐसी वस्तुएं बनाने की अनुमति देता है जिन पर पुनरावृति की जा सकती है। एक पुनरावर्तक एक सूची, एक स्ट्रिंग, या किसी अन्य चलने योग्य वस्तु के माध्यम से लूप कर सकता है, और एक विशेष क्रिया कर सकता है।
क्या आप एक चुनौती के लिए तैयार हैं? एक पुनरावर्तक बनाएं जो संख्याओं की सूची के माध्यम से लूप करता है और प्रत्येक संख्या को दो से गुणा करता है।
इस पुनरावर्तक के लिए कोड हमारे उपरोक्त उदाहरण के समान होगा - यह अभी भी पुनरावर्तक प्रोटोकॉल का उपयोग करेगा - लेकिन मुख्य कार्यक्रम में वापस आने से पहले इसे सूची में प्रत्येक संख्या को दो से गुणा करना चाहिए।
अब आप एक विशेषज्ञ की तरह अपने खुद के इटरेटर्स को पायथन में लिखना शुरू करने के लिए तैयार हैं!