Вопрос-Ответ

How can I break out of multiple loops?

Как я могу выйти из нескольких циклов?

Приведен следующий код (который не работает):

while True:
# Snip: print out current state
while True:
ok = get_input("Is this ok? (y/n)")
if ok.lower() == "y": break 2 # This doesn't work :(
if ok.lower() == "n": break

# Do more processing with menus and stuff

Есть ли способ заставить это работать? Или мне нужно выполнить одну проверку, чтобы выйти из цикла ввода, затем другую, более ограниченную, проверку во внешнем цикле, чтобы выйти из всего вместе, если пользователь удовлетворен?

Переведено автоматически
Ответ 1

Моим первым побуждением было бы преобразовать вложенный цикл в функцию и использовать return для выхода.

Ответ 2

Вот еще один короткий подход. Недостатком является то, что вы можете разорвать только внешний цикл, но иногда это именно то, что вы хотите.

for a in xrange(10):
for b in xrange(20):
if something(a, b):
# Break the inner loop...
break
else:
# Continue if the inner loop wasn't broken.
continue
# Inner loop was broken, break the outer.
break

Здесь используется конструкция for / else, описанная в: Почему python использует 'else' после циклов for и while?

Ключевой вывод: Это только кажется, что внешний цикл всегда прерывается. Но если внутренний цикл не прерывается, внешний цикл тоже не прерывается.

Оператор continue здесь волшебный. Он находится в предложении for-else . По определению это происходит, если нет внутреннего разрыва. В этой ситуации continue аккуратно обходит внешний разрыв.

Ответ 3

PEP 3136 предлагает надпись break / continue . Guido отклонил это, потому что "код настолько сложный, что требует этой функции, встречается очень редко". Однако в PEP упоминаются некоторые обходные пути (например, метод исключения), в то время как Guido считает, что рефакторинг с использованием return в большинстве случаев будет проще.

Ответ 4

Во-первых, полезна обычная логика.

Если по какой-либо причине условия завершения не могут быть выполнены, исключения - это запасной план.

class GetOutOfLoop( Exception ):
pass

try:
done= False
while not done:
isok= False
while not (done or isok):
ok = get_input("Is this ok? (y/n)")
if ok in ("y", "Y") or ok in ("n", "N") :
done= True # probably better
raise GetOutOfLoop
# other stuff
except GetOutOfLoop:
pass

Для этого конкретного примера исключение может быть необязательным.

С другой стороны, у нас часто есть опции "Y", "N" и "Q" в приложениях с символьным режимом. Для опции "Q" нам нужен немедленный выход. Это более исключительный вариант.

python