क्यों जब आप __next__() विधि को str पर कॉल करते हैं तो यह कहता है कि इसमें यह विधि नहीं है ...

b = 'hello'
b.__next__()  # give AttributeError: 'str' object has no attribute '__next__'
a = iter(b)
a.__next__() # output == 'h'
    

क्या __iter__() विधि स्वयं वापस नहीं आती है? ठीक है, अगर यह स्वयं लौटाता है, तो यह एक स्ट्रिंग है जिसमें __next__() विधि नहीं है?

तो "h" कैसे लौटाता है?

1
Warrior199 8 जुलाई 2021, 20:10

2 जवाब

सबसे बढ़िया उत्तर

iter अपना तर्क तभी लौटाता है जब मान एक पुनरावर्तक है। str एक पुनरावर्तक नहीं है; यह एक पुनरावर्तनीय है जिसकी __iter__ विधि एक str_iterator वस्तु लौटाती है।

>>> a = iter(b)
>>> type(a)
<class 'str_iterator'>

str_iterator ऑब्जेक्ट __next__ को लागू करता है, और एक ही ऑब्जेक्ट पर किसी भी अन्य इटरेटर से अलग पुनरावृत्ति स्थिति को बनाए रखता है।

>>> b = 'hello'
>>> a1 = iter(b)
>>> a2 = iter(b)
>>> next(a1)
'h'
>>> next(a2)
'h'
>>> next(a2)
'e'
>>> next(a2)
'l'
>>> next(a1)
'e'

आप str_iterator को कुछ इस तरह परिभाषित करते हुए देख सकते हैं

class str_iterator:
    def __init__(self, s):
        self.s = s
        self.i = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.i == len(self.s):
            raise StopIteration
        i = self.i
        self.i += 1
        return self.s[i]

 class str:

     ...

     def __iter__(s):
         return str_iterator(s)

इटरेटर याद रखता है __next__ पर कॉल के बीच स्ट्रिंग में स्थिति है। __next__ का काम "पॉइंटर" को आगे बढ़ाना और कैरेक्टर को सही स्थिति में लौटाना है।

6
chepner 8 जुलाई 2021, 17:40

"पुनरावृत्तियों" को "पुनरावृत्तियों" के साथ भ्रमित न करें:

1- Iterables iterables के प्रोटोकॉल को लागू करता है जो __iter__ है।

2- इटरेटर्स इटरेटर्स प्रोटोकॉल को लागू करते हैं जो __iter__ और __next__ है।

आप देख सकते हैं कि इटरेटर स्वयं पुनरावर्तनीय हैं लेकिन रिवर्स सत्य नहीं है।

आपके मामले में, b "पुनरावर्तनीय" है न कि "पुनरावर्तक"। इटरेटर को वापस पाने के लिए आपको iter() पर कॉल करना चाहिए।

क्या __iter__() विधि स्वयं वापस नहीं आती है?

यदि वस्तु "पुनरावर्तक" है हाँ। यदि वस्तु "पुनरावर्तनीय" है, नहीं, इसे पुनरावर्तक वापस करना चाहिए।

4
SorousH Bakhtiary 8 जुलाई 2021, 17:20