Я хотел знать, есть ли какие-либо встроенные способы продолжить следующую итерацию во внешнем цикле в python. Например, рассмотрим код:
for ii in range(200):
for jj in range(200, 400):
...block0...
if something:
continue
...block1...
Я хочу, чтобы этот оператор continue выходил из цикла jj и переходил к следующему элементу в цикле ii. Я могу реализовать эту логику каким-либо другим способом (установив переменную флага), но есть ли простой способ сделать это или это все равно что просить слишком много?
Ответы:
В общем случае, когда у вас есть несколько уровней цикла и
break
он не работает для вас (потому что вы хотите продолжить один из верхних циклов, а не тот, который находится прямо над текущим), вы можете выполнить одно из следующихРеорганизуйте циклы, из которых вы хотите выйти, в функцию
Недостатком является то, что вам может потребоваться передать этой новой функции некоторые переменные, которые ранее были в области видимости. Вы можете либо просто передать их как параметры, сделать их экземплярами переменных для объекта (создать новый объект только для этой функции, если это имеет смысл), либо глобальные переменные, синглтоны, что угодно (эхм, эм).
Или вы можете определить
inner
как вложенную функцию и позволить ей просто фиксировать то, что ей нужно (может быть медленнее?)Используйте исключения
С философской точки зрения, это то, для чего нужны исключения, прерывающие выполнение программы через строительные блоки структурированного программирования (если, для, пока), когда это необходимо.
Преимущество заключается в том, что вам не нужно разбивать один фрагмент кода на несколько частей. Это хорошо, если вы проектируете какое-то вычисление, когда пишете его на Python. Введение абстракций на этом раннем этапе может замедлить вас.
Плохая вещь с этим подходом заключается в том, что авторы интерпретаторов / компиляторов обычно предполагают, что исключения являются исключительными, и соответственно оптимизируют их.
Создайте для этого специальный класс исключения, чтобы не рисковать случайно отключить какое-либо другое исключение.
Что-то совсем другое
Я уверен, что есть и другие решения.
источник
Break
прервет внутренний цикл, и блок 1 не будет выполнен (он будет запущен, только если внутренний цикл завершится нормально).источник
for...else
часто бывает полезной конструкцией, хотя может сбивать с толку. Просто помните, чтоelse
в данном контексте это означает «без перерыва».На других языках вы можете пометить цикл и выйти из помеченного цикла. Предложение по улучшению Python (PEP) 3136 предлагало добавить их в Python, но Гвидо отклонил его :
Так что, если вы на это надеялись, вам не повезло, но посмотрите на один из других ответов, так как там есть хорошие варианты.
источник
for-else
сложнее, труднее читать и, вероятно, больше злоупотребляют (если не явной ошибкой), чем были бы именованные циклы. Думаю, я бы использовал другое ключевое слово, чемelse
- возможно, что-то вродеresume
было бы хорошо? Выbreak
в курсе, иresume
это сразу после него?Я думаю, вы могли бы сделать что-то вроде этого:
источник
for
,else
раньше (и я думаю , что даже большинство людей , которые не может вспомнить с верхней частью головы , как это работает).Я думаю, что один из самых простых способов добиться этого - заменить «continue» оператором «break», т.е.
Например, вот простой код, чтобы увидеть, как именно это происходит:
источник
Другой способ справиться с этой проблемой - использовать Exception ().
Например:
результат:
Предполагая, что мы хотим перейти к внешнему циклу n из цикла m, если m = 3:
результат:
Ссылка для справки: http://www.programming-idioms.org/idiom/42/continue-outer-loop/1264/python
источник
Мы хотим что-то найти, а затем остановить внутреннюю итерацию. Я использую систему флагов.
источник
False:continue
дело в ... необычном форматировании. Как это часто бывает в «естественных» системах, где экспоненциальные показатели являются нормой, вам нужно всего лишь несколько раз ударить SO, чтобы накопить значительное количество очков репутации. В любом случае, мои «лучшие» ответы обычно наименее популярны.Я только что сделал что-то подобное. Моим решением было заменить внутренний цикл for на понимание списка.
где op - некоторый логический оператор, действующий на комбинацию ii и jj. В моем случае, если какая-либо из операций вернула истину, я был готов.
На самом деле это не сильно отличается от разбиения кода на функцию, но я подумал, что использование оператора «любой» для выполнения логического ИЛИ над списком логических значений и выполнения всей логики в одной строке было бы интересным. Это также позволяет избежать вызова функции.
источник