2012-07-05 14 views
8

मैं एक सूची के माध्यम से पुनरावृति करने के लिए कोशिश कर रहा हूँ, और मैं विशिष्ट कार्रवाई करने के लिए जब और केवल जब यात्रा सूची के अंत पर पहुंच गया, नीचे उदाहरण देखें की जरूरत है:सूची के माध्यम से दोहराएं और अजगर में StopIteration संभाल खूबसूरती से

data = [1, 2, 3] 

data_iter = data.__iter__() 
try: 
    while True: 
     item = data_iter.next() 
     try: 
      do_stuff(item) 
      break # we just need to do stuff with the first successful item 
     except: 
      handle_errors(item) # in case of no success, handle and skip to next item 
except StopIteration: 
    raise Exception("All items weren't successful") 

मेरा मानना ​​है कि यह कोड बहुत पाइथनिक नहीं है, इसलिए मैं एक बेहतर तरीका ढूंढ रहा हूं। मुझे लगता है कि आदर्श कोड नीचे इस काल्पनिक टुकड़े की तरह दिखना चाहिए:

data = [1, 2, 3] 

for item in data: 
    try: 
     do_stuff(item) 
     break # we just need to do stuff with the first successful item 
    except: 
     handle_errors(item) # in case of no success, handle and skip to next item 
finally: 
    raise Exception("All items weren't successful") 

किसी भी विचार का स्वागत है।

+0

'else' के साथ 'आखिरकार' को प्रतिस्थापित करें? – WolframH

+0

"सभी आइटम सफल नहीं थे" के बजाय आपके पास ''सभी आइटम सफल नहीं थे' 'क्यों? वह मध्य एस्ट्रोफ़े आपके स्ट्रिंग/अपवाद को तोड़ देगा यदि यह चलता है। इसके अलावा, वोल्फ्रामएच के बिंदु पर, [डॉक्स] (http://docs.python.org/reference/compound_stmts.html#for) देखें - 'आखिरकार' के बजाय 'else' काम करना चाहिए। – thegrinner

+1

यह ध्यान देने योग्य है कि 'छोड़कर:' एक भयानक बात है - अगर यह सिर्फ उदाहरण के लिए है, ठीक है, लेकिन किसी भी वास्तविक उदाहरण में, कृपया केवल एक विशिष्ट अपवाद प्राप्त करें। –

उत्तर

16

आप पाश के लिए एक के बाद else उपयोग कर सकते हैं, और यदि आप पाश के लिए से बाहर break नहीं था कि else भीतर कोड केवल निष्पादित होने

data = [1, 2, 3] 

for item in data: 
    try: 
     do_stuff(item) 
     break # we just need to do stuff with the first successful item 
    except Exception: 
     handle_errors(item) # in case of no success, handle and skip to next item 
else: 
    raise Exception("All items weren't successful") 

आप documentation for the for statement, प्रासंगिक टुकड़े में खोज सकते हैं नीचे दिखाया गया है:

for_stmt ::= "for" target_list "in" expression_list ":" suite 
       ["else" ":" suite] 

एक break बयान पहले सूट में मार डालाको क्रियान्वित करने के बिना पाश समाप्त हो जाता है 210 खंड सूट।

+1

जैसा कि मैं इसे टाइप कर रहा था। +1 - यह करने का यह सबसे अच्छा तरीका है। –

+0

हाँ, यह स्पष्ट था, धन्यवाद! –

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