for i in ...:
for j in ...:
for k in ...:
if something:
# continue loop i
В общем случае, когда у вас есть несколько уровней зацикливания и break
не работает для вас (потому что вы хотите продолжить один из верхних циклов, а не тот, который находится прямо над текущим), вы можете сделать один следующего
Рефакторинг циклов, из которых вы хотите выйти в функцию
def inner():
for j in ...:
for k in ...:
if something:
return
for i in ...:
inner()
Недостатком является то, что вам может потребоваться передать этой новой функции некоторые переменные, которые ранее находились в области видимости. Вы можете либо просто передать их как параметры, сделать их переменными экземпляра объекта (создать новый объект только для этой функции, если это имеет смысл), либо глобальными переменными, синглетами и т. Д. (Эм, эм).
Или вы можете определить inner
как вложенную функцию и позволить ей просто захватывать то, что ей нужно (может быть медленнее?)
for i in ...:
def inner():
for j in ...:
for k in ...:
if something:
return
inner()
Использовать исключения
С точки зрения философии, это то, для чего нужны исключения, когда необходимо разорвать поток программы через строительные блоки структурированного программирования (если, для, в то время).
Преимущество заключается в том, что вам не нужно разбивать один фрагмент кода на несколько частей. Это хорошо, если вы разрабатываете какие-то вычисления, когда пишете их на Python. Введение абстракций на этом раннем этапе может замедлить вас.
Недостаток этого подхода в том, что авторы интерпретатора / компилятора обычно предполагают, что исключения являются исключительными, и оптимизируют их соответственно.
class ContinueI(Exception):
pass
continue_i = ContinueI()
for i in ...:
try:
for j in ...:
for k in ...:
if something:
raise continue_i
except ContinueI:
continue
Создайте для этого специальный класс исключений, чтобы вы не рискнули случайно отключить какое-то другое исключение.
Что-то еще целиком
Я уверен, что есть и другие решения.