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
Створіть для цього спеціальний клас винятків, щоб ви не ризикували випадково заглушити якийсь інший виняток.
Щось ще цілком
Я впевнений, що є ще інші рішення.