2016-08-10 5 views
5

मैंने एक ऑब्जेक्ट ऑब्जेक्ट ए बनाया है जिसमें अन्य ऑब्जेक्ट्स की एक सूची है। मैं सूची में किसी विशेष ऑब्जेक्ट को स्वचालित रूप से छोड़ने में सक्षम होना चाहता हूं जब ऑब्जेक्ट ए को लूप में उपयोग किया जाता है तो खराब चिह्नित किया जाता है।अपनी प्री-पूछताछ स्थिति को बदलने के बिना पाइथन में एक पुनरावर्तक से पूछताछ कैसे करें

class A(): 
    def __init__(self): 
    self.Blist = [B(1), B(2), B(3)] #where B(2).is_bad() is True, while the other .is_bad() are False 

    def __iter__(self): 
    nextB = iter(self.Blist) 
    #if nextB.next().is_bad(): 
    # return after skip 
    #else: 
    # return nextB 

हालांकि, मैं समझ नहीं सशर्त है कि ऊपर छद्म कोड में टिप्पणी की है यात्रा लंघन के बिना, पूछा लिखने के लिए कैसे (किसी और खंड विफल रहता है)

धन्यवाद!

+0

आप अपने चरमपंथियों को 'peek()' फ़ंक्शन वाले ऑब्जेक्ट्स में एन्सेप्लेट कर सकते हैं और अगले ओवरराइड()। इसमें एक स्टेट वैरिएबल होना चाहिए जो ट्रैक को ट्रैक करता है जिसे सबसे हाल ही में, अगली() या peek() कहा जाता है। अगर अगली() को अपने आप के बाद बुलाया जाता है, तो इसे अगले() को encapsulated ऑब्जेक्ट पर कॉल करना चाहिए, परिणाम वापस कर देना चाहिए और उसे बफर में भी स्टोर करना चाहिए। अगर इसे एक चोटी के बाद बुलाया गया था() इसे बफर वापस करना चाहिए। Peek() हमेशा encapsulated अगले() को कॉल करें, इसे वापस करें और इसे बफर() में संग्रहीत करें। –

उत्तर

1

आप एक जनरेटर समारोह का उपयोग कर सकते हैं:

def __iter__(self): 
     for item in self.Blist: 
      if not item.is_bad(): 
       yield item 

एक जनरेटर समारोह कीवर्ड yield द्वारा चिह्नित है। जनरेटर फ़ंक्शन जनरेटर ऑब्जेक्ट देता है, जो एक इटरेटर है। यह yield कथन पर निष्पादन को निलंबित कर देगा और फिर कॉलिंग रूटीन इंटरमीटर पर next पर कॉल करने पर प्रसंस्करण फिर से शुरू करेगा।

+0

consise और स्पष्ट जवाब। धन्यवाद! – Pato

+0

इसके अलावा, क्या इसे पहली पंक्ति की आवश्यकता है? लूप बस स्वयं के लिए आइटम के लिए हो सकता है। सूची: ' – Pato

+0

आप सही हैं, इसे पहली पंक्ति की आवश्यकता नहीं है। मैंने आपके सुझाव को दर्शाने के लिए अपना जवाब संशोधित कर दिया है। –

1

कैसे के बारे में:

def __iter__(self): 
    nextB = iter(self.Blist) 
    for b_obj in nextB: 
     if b_obj.is_bad(): 
      yield b_obj 

एक सरल उदाहरण:

class B: 
    def __init__(self, cond): 
     self.cond = cond 

    def is_bad(self): 
     return self.cond 

class A: 
    def __init__(self): 
    self.Blist = [B(True), B(False), B(True)] 

    def __iter__(self): 
    nextB = iter(self.Blist) 
    for b_obj in nextB: 
     if b_obj.is_bad(): 
      yield b_obj 

a = A() 
for x in a: 
    print(x.is_bad()) 

>> True 
    True 
+0

धन्यवाद! मैंने हंस विकल्प को सबसे अच्छा सिम्प्पी चुना क्योंकि वह वही है जो खराब बी को छोड़ देता है, आपका विपरीत है। लेकिन दोनों मुझे क्या चाहिए :) – Pato

संबंधित मुद्दे