उपर्युक्त उत्तर बहुत अच्छे हैं, लेकिन मैंने जो देखा है, उनमें से अधिकांश , मेरे जैसे लोगों के लिए पर्याप्त अंतर पर जोर नहीं देते हैं ।
इसके अलावा, लोग "एक्स एक ऑब्जेक्ट है जो __foo__()
विधि है" जैसी परिभाषाएं डालकर "बहुत पाइथोनिक" प्राप्त करते हैं । इस तरह की परिभाषाएं सही हैं - वे बतख-टाइपिंग दर्शन पर आधारित हैं, लेकिन इसकी सरलता में अवधारणा को समझने की कोशिश करते समय तरीकों पर ध्यान केंद्रित होता है।
इसलिए मैं अपना संस्करण जोड़ता हूं।
प्राकृतिक भाषा में,
- पुनरावृति तत्वों की एक पंक्ति में एक समय में एक तत्व लेने की प्रक्रिया है।
पायथन में,
iterable एक ऐसी वस्तु है जो, अच्छी तरह से, iterable है, जिसे सीधे शब्दों में कहें तो इसका मतलब है कि इसे iteration में इस्तेमाल किया जा सकता है, जैसे कि एक for
लूप के साथ । कैसे? इटरेटर का उपयोग करके । मैं नीचे समझाता हूँ।
... जबकि इटरेटर एक वस्तु है कि परिभाषित करता है कि कैसे वास्तव में क्या करने के लिए यात्रा - विशेष रूप से आगे क्या है तत्व। इसलिए इसकी next()
विधि होनी चाहिए
।
Iterators स्वयं भी चलने योग्य हैं, इस भेद के साथ कि उनकी __iter__()
विधि एक ही वस्तु ( self
) लौटाती है , भले ही पिछली कॉल द्वारा इसके आइटम का उपभोग किया गया हो या नहीं next()
।
जब for x in obj:
बयान देखता है तो पायथन दुभाषिया क्या सोचता है ?
देखो, एक for
पाश। एक पुनरावृत्ति के लिए एक नौकरी की तरह लग रहा है ... चलो एक मिलता है। ... वहाँ यह obj
आदमी है, तो चलो उससे पूछते हैं।
"श्रीमान obj
, क्या आपके पास इसका पुनरावृत्ति है?" (... कॉल iter(obj)
, जो कॉल करता है
obj.__iter__()
, जो खुशी से एक चमकदार नया पुनरावृत्ति करता है _i
।)
ठीक है, यह आसान था ... चलो फिर चलना शुरू करते हैं। ( x = _i.next()
... x = _i.next()
...)
चूंकि श्री obj
इस परीक्षण में सफल रहे (कुछ विधि द्वारा एक वैध पुनरावर्तक लौटकर), हम उन्हें विशेषण के साथ पुरस्कृत करते हैं: अब आप उन्हें "चलने योग्य श्री obj
" कह सकते हैं ।
हालाँकि, साधारण मामलों में, आपको सामान्य रूप से पुनरावृत्त और पुनरावृत्त होने से कोई लाभ नहीं होता है। तो आप केवल एक ही वस्तु को परिभाषित करते हैं , जो कि स्वयं का पुनरावृत्त भी है। (पायथन वास्तव में परवाह नहीं करता है कि उसके _i
द्वारा सौंप दिया गया obj
था वह सब चमकदार नहीं था, लेकिन सिर्फ obj
खुद के लिए था।)
यही कारण है कि अधिकांश उदाहरणों में मैंने देखा है (और जो मुझे बार-बार भ्रमित कर रहा था), आप देख सकते हैं:
class IterableExample(object):
def __iter__(self):
return self
def next(self):
pass
के बजाय
class Iterator(object):
def next(self):
pass
class Iterable(object):
def __iter__(self):
return Iterator()
हालांकि, ऐसे मामले भी हैं, जब आप पुनरावृत्त होने से अलग होने से लाभ उठा सकते हैं, जैसे कि जब आप एक पंक्ति में आइटम रखना चाहते हैं, लेकिन अधिक "शाप"। उदाहरण के लिए जब आप "वर्तमान" और "आगामी" तत्वों के साथ काम करना चाहते हैं, तो आपके पास दोनों के लिए अलग-अलग पुनरावृत्तियों हो सकते हैं। या एक विशाल सूची से कई धागे खींच रहे हैं: प्रत्येक के पास सभी वस्तुओं पर पार करने के लिए अपना स्वयं का इटर्वर हो सकता है। ऊपर @ रेमंड्स और @ ग्लॉगल के उत्तर देखें।
कल्पना कीजिए कि आप क्या कर सकते हैं:
class SmartIterableExample(object):
def create_iterator(self):
# An amazingly powerful yet simple way to create arbitrary
# iterator, utilizing object state (or not, if you are fan
# of functional), magic and nuclear waste--no kittens hurt.
pass # don't forget to add the next() method
def __iter__(self):
return self.create_iterator()
टिप्पणियाँ:
मैं फिर से दोहराऊंगा: पुनरावृत्त पुनरावृत्ति नहीं है । Iterator को for
लूप में "स्रोत" के रूप में उपयोग नहीं किया जा सकता है । for
लूप को मुख्य रूप से क्या चाहिए __iter__()
(जो कुछ के साथ कुछ देता है next()
)।
बेशक, for
केवल पुनरावृत्ति लूप नहीं है, इसलिए ऊपर कुछ अन्य निर्माणों पर भी लागू होता है ( while
...)।
Iterator की next()
पुनरावृत्ति को रोकने के लिए StopIteration फेंक सकते हैं। हालांकि, यह हमेशा के लिए पुनरावृति कर सकता है या अन्य साधनों का उपयोग नहीं करता है।
उपरोक्त "विचार प्रक्रिया" में, _i
वास्तव में मौजूद नहीं है। मैंने वह नाम बना लिया है।
पायथन 3.x में एक छोटा सा बदलाव है: next()
विधि (बिल्ट-इन नहीं) अब कहा जाना चाहिए __next__()
। हाँ, यह ऐसा ही होना चाहिए था।
आप इसे इस तरह भी सोच सकते हैं: चलने योग्य डेटा है, पुनरावृत्त अगले आइटम को खींचता है
अस्वीकरण: मैं किसी भी पायथन इंटरप्रेटर का डेवलपर नहीं हूं, इसलिए मैं वास्तव में नहीं जानता कि दुभाषिया "क्या सोचता है"। उपरोक्त कथनों का पूरी तरह से प्रदर्शन है कि कैसे मैं अन्य विषयों, प्रयोगों और पायथन नौसिखिया के वास्तविक जीवन के अनुभव से विषय को समझता हूं।
collections.abc.AsyncIterator
परीक्षण__aiter__
और__anext__
विधियों के लिए। यह 3.6 में एक नया जोड़ है।