अजगर Iterators (__iter__ और __next__): इसका उपयोग कैसे करें और क्यों करें?

Iterators ऐसी वस्तुएँ हैं जिन पर पुनरावृत्ति की जा सकती है। इस ट्यूटोरियल में, आप सीखेंगे कि यह कैसे काम करता है और कैसे आप __iter__ और __next__ विधियों का उपयोग करके अपने स्वयं के इटेरेटर का निर्माण कर सकते हैं।

वीडियो: अजगर Iterators

पायथन में Iterators

पायथन में हर जगह Iterators हैं। वे forलूप्स, कॉम्प्रिहेंशन, जनरेटर आदि के भीतर सुरुचिपूर्ण ढंग से कार्यान्वित किए जाते हैं , लेकिन सादे दृश्य में छिपे होते हैं।

Python में Iterator बस एक ऐसी वस्तु है जिस पर ध्यान दिया जा सकता है। एक वस्तु जो एक बार में डेटा, एक तत्व को वापस करेगी।

तकनीकी रूप से, पायथन इट्रेटर ऑब्जेक्ट को दो विशेष विधियों को लागू करना चाहिए, __iter__()और __next__(), सामूहिक रूप से इट्रेटर प्रोटोकॉल कहा जाता है

किसी ऑब्जेक्ट को iterable कहा जाता है यदि हम इससे एक इटर्मीटर प्राप्त कर सकते हैं। पायथन में अधिकांश निर्मित कंटेनर जैसे: सूची, टपल, स्ट्रिंग आदि पुनरावृत्त हैं।

iter()समारोह (बदले में कॉल जो __iter__()विधि) उन लोगों से एक iterator देता है।

एक Iterator के माध्यम से Iterating

हम next()फ़ंक्शन का उपयोग मैन्युअल रूप से पुनरावृति के सभी आइटम्स के माध्यम से करने के लिए करते हैं। जब हम अंत तक पहुँचते हैं और कोई और डेटा वापस नहीं आता है, तो यह StopIterationअपवाद को बढ़ाएगा । निम्नलिखित एक उदाहरण है।

 # define a list my_list = (4, 7, 0, 3) # get an iterator using iter() my_iter = iter(my_list) # iterate through it using next() # Output: 4 print(next(my_iter)) # Output: 7 print(next(my_iter)) # next(obj) is same as obj.__next__() # Output: 0 print(my_iter.__next__()) # Output: 3 print(my_iter.__next__()) # This will raise error, no items left next(my_iter)

आउटपुट

 4 7 0 3 ट्रेसीबैक (सबसे हालिया कॉल अंतिम): फाइल "", लाइन 24, अगले (my_iter) स्टॉपइंटरेशन में

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

 >>> for element in my_list:… print(element)… 4 7 0 3

Iterators के लिए लूप के लिए कार्य करना

जैसा कि हम उपरोक्त उदाहरण में देखते हैं, forलूप सूची के माध्यम से स्वचालित रूप से पुनरावृत्त करने में सक्षम था।

वास्तव में forलूप किसी भी चलने योग्य पर पुनरावृति कर सकता है। आइए इस बात पर करीब से नज़र डालें कि forलूप वास्तव में पायथन में कैसे लागू किया जाता है।

 for element in iterable: # do something with element

के रूप में वास्तव में लागू किया गया है।

 # create an iterator object from that iterable iter_obj = iter(iterable) # infinite loop while True: try: # get the next item element = next(iter_obj) # do something with element except StopIteration: # if StopIteration is raised, break from loop break

तो आंतरिक रूप से, forलूप पुनरावृत्त वस्तु बनाता है, पुनरावृति पर iter_objकॉल करके iter()

विडंबना यह है कि यह forलूप वास्तव में लूप होते हुए अनंत है।

लूप के अंदर, यह next()अगले तत्व को प्राप्त करने के लिए कहता है और forलूप के शरीर को इस मान से निष्पादित करता है । सभी वस्तुओं के निकास के बाद, StopIterationउठाया जाता है जो आंतरिक रूप से पकड़ा जाता है और लूप समाप्त होता है। ध्यान दें कि किसी भी अन्य प्रकार के अपवाद से गुजरना होगा।

बिल्डिंग कस्टम इटरेटर्स

पाइथन में स्क्रैच से एक इटरेटर बनाना आसान है। हमें सिर्फ __iter__()और सिर्फ __next__()तरीकों को लागू करना है ।

__iter__()विधि इटरेटर वस्तु ही देता है। यदि आवश्यक हो, तो कुछ आरंभीकरण किया जा सकता है।

__next__()विधि अनुक्रम में अगले आइटम लौट जाना चाहिए। अंत तक पहुंचने पर, और बाद की कॉल में, इसे उठाना होगा StopIteration

यहां, हम एक उदाहरण दिखाते हैं जो हमें प्रत्येक पुनरावृत्ति में 2 की अगली शक्ति देगा। पावर एक्सपोनेंट शून्य से शुरू होकर उपयोगकर्ता सेट संख्या तक होता है।

यदि आपके पास ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के बारे में कोई विचार नहीं है, तो पायथन ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग पर जाएं।

 class PowTwo: """Class to implement an iterator of powers of two""" def __init__(self, max=0): self.max = max def __iter__(self): self.n = 0 return self def __next__(self): if self.n <= self.max: result = 2 ** self.n self.n += 1 return result else: raise StopIteration # create an object numbers = PowTwo(3) # create an iterable from the object i = iter(numbers) # Using next to get to the next iterator element print(next(i)) print(next(i)) print(next(i)) print(next(i)) print(next(i))

आउटपुट

 1 2 4 8 ट्रेसेबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "/home/bsoyuj/Desktop/Untitled-1.py", पंक्ति 32, प्रिंट में (अगला (i)) फ़ाइल "", लाइन 18, __next__ में StopIteration बढ़ाएँ रोक

हम forअपने itter वर्ग पर पुनरावृति करने के लिए एक लूप का उपयोग कर सकते हैं ।

 >>> for i in PowTwo(5):… print(i)… 1 2 4 8 16 32

पायथन अनंत इटरेटर

यह आवश्यक नहीं है कि एक पुनरावृत्त वस्तु में आइटम समाप्त हो जाए। अनंत पुनरावृत्तियाँ हो सकती हैं (जो कभी समाप्त नहीं होती हैं)। ऐसे पुनरावृत्तियों से निपटने के दौरान हमें सावधान रहना चाहिए।

यहाँ अनंत पुनरावृत्तियों को प्रदर्शित करने के लिए एक सरल उदाहरण है।

The built-in function iter() function can be called with two arguments where the first argument must be a callable object (function) and second is the sentinel. The iterator calls this function until the returned value is equal to the sentinel.

 >>> int() 0 >>> inf = iter(int,1) >>> next(inf) 0 >>> next(inf) 0

We can see that the int() function always returns 0. So passing it as iter(int,1) will return an iterator that calls int() until the returned value equals 1. This never happens and we get an infinite iterator.

We can also build our own infinite iterators. The following iterator will, theoretically, return all the odd numbers.

 class InfIter: """Infinite iterator to return all odd numbers""" def __iter__(self): self.num = 1 return self def __next__(self): num = self.num self.num += 2 return num

A sample run would be as follows.

 >>> a = iter(InfIter()) >>> next(a) 1 >>> next(a) 3 >>> next(a) 5 >>> next(a) 7

And so on…

Be careful to include a terminating condition, when iterating over these types of infinite iterators.

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

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

दिलचस्प लेख...