whileTrue: # Snip: print out current state whileTrue: ok = get_input("Is this ok? (y/n)") if ok.lower() == "y": break2# 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
Ключевой вывод: Это только кажется, что внешний цикл всегда прерывается. Но если внутренний цикл не прерывается, внешний цикл тоже не прерывается.
Оператор continue здесь волшебный. Он находится в предложении for-else . По определению это происходит, если нет внутреннего разрыва. В этой ситуации continue аккуратно обходит внешний разрыв.
Ответ 3
PEP 3136 предлагает надпись break / continue . Guido отклонил это, потому что "код настолько сложный, что требует этой функции, встречается очень редко". Однако в PEP упоминаются некоторые обходные пути (например, метод исключения), в то время как Guido считает, что рефакторинг с использованием return в большинстве случаев будет проще.
Ответ 4
Во-первых, полезна обычная логика.
Если по какой-либо причине условия завершения не могут быть выполнены, исключения - это запасной план.
classGetOutOfLoop( Exception ): pass
try: done= False whilenot done: isok= False whilenot (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" нам нужен немедленный выход. Это более исключительный вариант.