Перебирать список и обрабатывать StopIteration в Python красиво

Я пытаюсь выполнить итерацию по списку, и мне нужно выполнить определенную операцию, когда и только когда итерация достигла конца списка, см. пример ниже:

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

любые мысли приветствуются.

1 ответов


можно использовать else после цикла for, и код внутри else выполняется, только если вы этого не сделали break из цикла for:

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

вы можете найти это в документация for сообщении, соответствующие части, показанные ниже:

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

A break оператор, выполненный в первом наборе, завершает цикл без выполнения elseпунктом люкс.