迭代列表并精美地处理Python中的StopIteration

时间:2012-07-05 20:28:09

标签: python list iterator 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")

我相信这段代码不太Pythonic,所以我正在寻找更好的方法。我认为理想的代码应该看起来像下面的假设:

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")

欢迎任何想法。

1 个答案:

答案 0 :(得分:16)

您可以在for循环后使用else,只有在for循环中没有else时才会执行break中的代码:

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语句终止循环而不执行else子句的套件。