Поскольку этот вопрос стал стандартным вопросом для взлома в конкретный цикл, я хотел бы привести свой ответ на примере, используя Exception
.
Несмотря на отсутствие метки с именем break of loop в конструкции с многострочным циклом, мы можем использовать User-defined Exceptions для перехода в конкретный цикл по нашему выбору. Рассмотрим следующий пример, в котором дайте нам печатать все числа ДО 4 цифры в базовой 6 системы нумерации:
class BreakLoop(Exception):
def __init__(self, counter):
Exception.__init__(self, 'Exception 1')
self.counter = counter
for counter1 in range(6): # Make it 1000
try:
thousand = counter1 * 1000
for counter2 in range(6): # Make it 100
try:
hundred = counter2 * 100
for counter3 in range(6): # Make it 10
try:
ten = counter3 * 10
for counter4 in range(6):
try:
unit = counter4
value = thousand + hundred + ten + unit
if unit == 4 :
raise BreakLoop(4) # Don't break from loop
if ten == 30:
raise BreakLoop(3) # Break into loop 3
if hundred == 500:
raise BreakLoop(2) # Break into loop 2
if thousand == 2000:
raise BreakLoop(1) # Break into loop 1
print('{:04d}'.format(value))
except BreakLoop as bl:
if bl.counter != 4:
raise bl
except BreakLoop as bl:
if bl.counter != 3:
raise bl
except BreakLoop as bl:
if bl.counter != 2:
raise bl
except BreakLoop as bl:
pass
Когда мы выводим вывод, что мы никогда не получит никакого значения которого блок место с 4. В этом случае, мы не отрываемся от какой-либо петли, так как BreakLoop(4)
поднят и пойман в одном цикле. Аналогично, всякий раз, когда десять мест имеют 3, мы пробиваем третий цикл, используя BreakLoop(3)
. Всякий раз, когда сто места имеют 5, мы ломаемся во вторую петлю, используя BreakLoop(2)
, и когда тысяча мест имеет 2, мы пробиваем первый цикл, используя BreakLoop(1)
.
Короче говоря, поднимите свое исключение (встроенное или определенное пользователем) во внутренние циклы и поймайте его в цикле, откуда вы хотите возобновить управление. Если вы хотите выйти из всех циклов, поймите Exception вне всех циклов. (Я не показал этот случай в примере).
Исключения не связаны, если это не какая-то странная идиома Python, которую мне еще предстоит узнать ... –
@monoxide: Исключения, похоже, ведут себя как специализированный goto, который выпрыгивает из нормального выполнения в содержащий блок try. Чувствует себя немного похожим на меня. –
См. Мой другой вопрос через некоторое время (http://stackoverflow.com/questions/174458/exceptions-for-flow-control), почти все согласились с тем, что это плохая идея, и это было потенциально законным использованием. –