2011-03-10 3 views
42

में कुछ पुनरावर्तनीय बनाता है जो पाइथन में कुछ हद तक सक्षम बनाता है? अर्थात। forपाइथन

के साथ इसे लूप कर सकते हैं क्या मेरे लिए पाइथन में एक पुनरावृत्ति वर्ग बनाना संभव है? यदि हां, तो कैसे?

उत्तर

50

कक्षा को पुन: प्रयोज्य बनाने के लिए, __iter__() विधि लिखें जो एक पुनरावर्तक लौटाता है। उदाहरण

class MyList(object): 
    def __init__(self): 
     self.list = [42, 3.1415, "Hello World!"] 
    def __iter__(self): 
     return iter(self.list) 

m = MyList() 
for x in m: 
    print x 

प्रिंट

42 
3.1415 
Hello World! 

उदाहरण एक सूची इटरेटर का उपयोग करता है, लेकिन आप भी या तो बनाने __iter__() एक generator द्वारा या पुनरावर्तक वर्ग का एक उदाहरण है कि एक next() को परिभाषित करता है वापस लौट कर अपनी खुद की इटरेटर लिख सकता है तरीका।

+2

'__getitem__' के साथ एक और तरीका भी है, http://stackoverflow.com/a/9884259/284795 –

+0

@ कोलोनेलपैनिक सही है, यदि आप कक्षा को' __getitem__' परिभाषित करते हैं तो यह भी सही है। हालांकि यह अनदेखा करेगा कि आपने '__len__' भी परिभाषित किया है और अनिश्चित काल तक फिर से शुरू किया है। – jlh

2

यह question आपकी मदद कर सकता है, यह बताता है कि कैसे एक interator

8

Python documentation का वर्णन करता है वास्तव में यह सुनिश्चित करने के लिए:

:

एक विधि कंटेनर वस्तुओं के लिए परिभाषित करने की आवश्यकता यात्रा सहायता प्रदान करने के

container.__iter__() 

एक पुनरावर्तक लौटाएं एटोर ऑब्जेक्ट। ऑब्जेक्ट को नीचे वर्णित इटरेटर प्रोटोकॉल का समर्थन करने के लिए आवश्यक है। यदि एक कंटेनर विभिन्न प्रकार के पुनरावृत्ति का समर्थन करता है, तो विशेष रूप से उन पुनरावृत्ति प्रकारों के लिए इटरेटर से अनुरोध करने के लिए अतिरिक्त विधियां प्रदान की जा सकती हैं। (पुनरावृत्ति के कई रूपों का समर्थन करने वाली ऑब्जेक्ट का एक उदाहरण एक पेड़ संरचना होगी जो चौड़ाई-प्रथम और गहराई-पहले ट्रैवर्सल दोनों का समर्थन करता है।) यह विधि पाइथन/सी एपीआई में पाइथन ऑब्जेक्ट्स के लिए टाइप स्ट्रक्चर के tp_iter स्लॉट से मेल खाती है।

इटरेटर वस्तुओं खुद को निम्नलिखित दो विधियों, जो एक साथ इटरेटर प्रोटोकॉल के रूप में समर्थन करने के लिए आवश्यक हैं:

iterator.__iter__() 

वापसी इटरेटर वस्तु ही। यह दोनों कंटेनर और इटरेटर को कथन के लिए और कथन के साथ उपयोग करने की अनुमति है। यह विधि पायथन/सी एपीआई में पायथन ऑब्जेक्ट्स के लिए टाइप स्ट्रक्चर के tp_iter स्लॉट से मेल खाती है।

iterator.next() 

वापसी कंटेनर से अगले आइटम। यदि कोई और आइटम नहीं है, तो StopIteration अपवाद बढ़ाएं। यह विधि पायथन/सी एपीआई में पायथन ऑब्जेक्ट्स के लिए टाइप स्ट्रक्चर के tp_iternext स्लॉट से मेल खाती है।

0

आप next() और __iter__() विधियों को चाहते हैं। Here's a nice little tutorial

+0

वह ट्यूटोरियल केवल पायथन 2 के लिए है। रिकॉर्ड के लिए, पायथन 3 अस्तित्व में था जब यह उत्तर पोस्ट किया गया था। पाइथन 3 के लिए यहां [एक] (http://nvie.com/posts/iterators-vs-generators/) है। –

4

__iter__() विधि वाला कोई भी ऑब्जेक्ट एक पुनरावर्तनीय माना जाता है।

इसके अतिरिक्त, कोई अनुक्रम (ऑब्जेक्ट्स जिसमें __getitem__() विधि है) एक पुनरावर्तक लौटा सकता है।एक इटरेटर __next__() विधि वाला ऑब्जेक्ट है जो अनुक्रम में अगली ऑब्जेक्ट देता है और स्टॉपइटरेशन अपवाद फेंकता है।