Как выйти из двух вложенных циклов
break прекращает только вложенный цикл. Внешний цикл продолжает работать. Используйте return , когда результат найден в вашем случае:
if current_user == 'ivanov': return scan_ip
Отслеживать
ответ дан 29 июл 2016 в 16:28
52.2k 11 11 золотых знаков 108 108 серебряных знаков 311 311 бронзовых знаков
Можно сделать так
while i
Вот более простой пример для понимания
for x in xrange(10): for y in xrange(10): for z in xrange(10): print x,y,z if x*y*z == 30: break # прерываем внутренний цикл else: continue # продолжаем, если внутренний цикл не был прерван break # внутренний цикл был прерван, прерываем и этот цикл else: continue break
Выход из цикла в С и Python: как правильно останавливать
Операто р «break» позволяет просто прервать цик л п ри достижении необходимого результата. После его объявления программа начнет выполнение со следующего оператора. Если «break» применяется во вложенном цикле, то выполнение кода продолжится во внешнем цикле, полностью заканчивая выполнение вложенного.
Например:
number = 0
for number in range(20):
print (“Я искомое число“ + str(number))
for another_number in range range(5):
number = number +1
if number == 3:
break
print( “ Я число, которое остановило программу:“ + str(another_number))
print ( “Цикл окончен“ )
В нашем случае , ка к т олько будет найдено , переменная «number» станет равной «3», вложенный цикл окончит свою работу , а код продолжит свою работу во внешнем цикле.
Оператор « continue »
Данный оператор применяется, когда нужно совершить не полный выход из цикла Python. Его используют, если необходимо не полностью выйти из цикла, а перейти к его следующей итерации. Или же «continue» применяется во внешнем цикле, для того чтобы пропустить выполнение вложенного.
Например:
number = 0
for number in range(20):
print (“Я искомое число“ + str(number))
continue
for another_number in range range(5):
number = number +1
if number == 3
print( “ Я число, которое остановило программу:“ + str(another_number))
print ( “Цикл окончен“ )
При таком применении оператора «continue» в ложенный цикл выполняться не будет.
Выход из цикла в С/С++
- break;
- continue.
Оператор « break »
Оператор «break» применяется в циклах «for», «while», «do-while», а также с оператором «switch». Наиболее часто оператор «break» применяется с условным оператором «if», когда в коде проверяется какое-то условие , и если найдено соответствие, то происходит выход из цикла.
Например:
#include
using namespace std;
void main()
int i, j;
// Рассмотрим применение «break» в разных ситуациях
// Применение «break» в цикле for
cout
for (i = 0; i < 10; i++)
if (i == 7)
break; // выход из цикла С, когда переменная i в нашем for будет равняться 7
// после выхода из цикла выполняется следующий код
cout >
// Применение «break» в цикле while
cout
i = 0;
while (i < 10)
if (i == 7)
break;
cout i++;
>
// Применение «break» в цикле do-while
cout
i = 0;
do
if (i == 7)
break;
cout i++;
> while (i < 10);
>
Операто р «continue»
Как и в языке Python, оператор «continue» применяется , когда необходимо перейти к следующей итерации цикл а л ибо необходим выход из вложенного цикла С во внешний. Данный оператор применяется во всех циклах С: for, while, do-while.
Например:
int main()
for (int count = 0; count < 40; ++count)
// Когда число делится на 5 без остатка, тогда пропускаем весь код при помощи оператора «continue»
if ((count % 5) == 0)
continue; // после этого оператора пропускается весь код, а выполнение программы переходит на конец цикла
// Когда число не делится без остатка на 5, тогда выполнение кода продолжается
std::cout
// Если сработало условие и отреагировал оператор «continue», тогда работа программы переносится в эту точку
>
return 0;
>
Заключение
Выход из цикла Python и С/С++ происходит по похожему сценарию. Если выучить правильное применение операторов «break» и «continue» в этих языках программирования, тогда эти знания можно будет применять и в других языках, потому что подход будет идентичным.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Как сделать «двойной break», то есть выйти из вложенного цикла, в Python?
Если бы мы программировали, например, на Java, то мы могли бы воспользоваться механизмом меток:
outterLoop: for(int i=0; i > >
Однако в Python такого механизма нет. Требуется предложить наиболее удобное в использовании и читаемое решение.
Возможные варианты ответа
- Поместить цикл в тело функции, а затем сделать return из неё:def func():ts="teste"tfor i in range(len(s)):ttfor j in range(i+1, len(s)):tttif s[i]==s[j]:ttttprint(i,j)ttttreturnfunc()Почему это плохая идея: разумеется, сама задача в условии — лишь абстрактный пример. В жизни циклов может быть гораздо больше, и создавать по функции для каждого из них как-то неестественно, не так ли?
- Выбросить исключение и поймать его снаружи цикла:try:ts="teste"tfor i in range(len(s)):ttfor j in range(i+1, len(s)):tttif s[i]==s[j]:ttttprint(i,j)ttttraise Exception()except:tprint("the end")Почему это плохая идея: здесь мы используем механизм исключений как особую форму goto, но ведь на самом деле ничего исключительного в коде не произошло — это обычная ситуация. Как минимум, причины такого злоупотребления этим механизмом будут непонятны другим программистам.
- Можно создать булевую переменную, которая будет хранить информацию о том, нужно ли выходить из внешнего цикла на данной итерации:exitFlag=Falses="teste"for i in range(len(s)):tfor j in range(i+1, len(s)):ttif s[i]==s[j]:tttprint(i,j)tttexitFlag=Truetttbreaktif(exitFlag):ttbreakПочему это плохая идея: из всех перечисленных выше идей эта, пожалуй, лучшая. Тем не менее, это весьма низкоуровневый подход, и в языке Python есть возможность реализовать задуманное гораздо лучше.
- Использовать вместо двух циклов for один while :s="teste"i=0j=1while i
Где там вообще хоть слово про двойной цикл или про перебор двух индексов? Нам нужно перебирать пары. Значит, по идее, мы должны написать что-то вроде этого:
s = "teste" for i, j in unique_pairs(len(s)): if s[i] == s[j]: print(i, j) break
Отлично, так мы будем перебирать пары. Но как нам добиться именно такой формы записи? Всё очень просто, нужно создать генератор. Делается это следующим образом:
def unique_pairs(n): for i in range(n): for j in range(i+1, n): yield i, j
«Как это работает?» — спросите вы. Всё просто. При вызове unique_pairs(int) код в теле функции не вычисляется. Вместо этого будет возвращён объект генератора. Каждый вызов метода next() этого генератора (что неявно происходит при каждой итерации цикла for ) код в его теле будет выполняться до тех пор, пока не будет встречено ключевое слово yield . После чего выполнение будет приостановлено, а метод вернёт указанный объект (здесь yield действует подобно return). При следующем вызове функция начнёт выполняться не с начала, а с того места, на котором остановилась в прошлый раз. При окончании перебора будет выброшено исключение StopIteration .
Итак, самый true pythonic way в решении этой задачи:
def unique_pairs(n): for i in range(n): for j in range(i+1, n): yield i, j s = "a string to examine" for i, j in unique_pairs(len(s)): if s[i] == s[j]: print(i, j) break
На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.
в комментариях подсказывают, что такой генератор уже реализован в стандартной библиотеке:
itertools.combinations(s, 2)
Что же, для данной задачи это действительно более pythonic решение. Хочется отметить, что целью статьи было скорее познакомить новичков с механизмом генераторов, нежели действительно решить проблему, заявленную в первом абзаце ?
На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.
Свои варианты предлагайте в комментариях!
Следите за новыми постами по любимым темам
Подпишитесь на интересующие вас теги, чтобы следить за новыми постами и быть в курсе событий.
5 простых способов выйти из вложенных циклов в Python
Python - элегантный язык программирования. Но у него есть слабые стороны. Иногда Python не так элегантен, как должен быть.
Например, когда нам нужно выйти из вложенных циклов:
for a in list_a: for b in list_b: if condition(a,b): break
break может помочь выйти только из внутреннего цикла. Можем ли мы напрямую выйти из двух вложенных циклов одновременно? Есть ли в Python какие-то встроенные ключевые слова или приемы для этого?
К сожалению, встроенная поддержка этой операции отсутствует.
В Python нет такой возможности, но она есть в других языках, например, PHP:
foreach ($a_list as $a) < foreach ($b_list as $b) < if (condition($a, $b)) < break 2; //break out of 2 loops >> >
В PHP ключевое слово break имеет параметр, который определяет, из скольких вложенных циклов нужно выйти. Значение по умолчанию равно 1, что означает выход из самого внутреннего цикла.
Поскольку Python очень гибкий, у нас есть много других способов получить тот же результат без встроенной поддержки.
В этой статье будут представлены 5 способов выхода из вложенных циклов в Python. А в конце будет упомянуто, как избежать проблемы вложенных циклов, если это возможно.
1. Добавьте флаг
Определим переменную и используем ее в качестве флага. Рассмотрим простой пример:
# add a flag variable break_out_flag = False for i in range(5): for j in range(5): if j == 2 and i == 0: break_out_flag = True break if break_out_flag: break
Как показано выше, переменная break_out_flag - это флаг, сообщающий программе, когда ей следует выйти из внешнего цикла.
Это работает, но код загрязняется, поскольку мы добавляем новую переменную для решения простой задачи.
Давайте рассмотрим другие варианты.
2. Бросить исключение
Если мы не можем использовать ключевое слово break, почему бы не реализовать выход из циклов другим способом? С помощью методов обработки исключений в Python мы можем выйти из вложенных циклов следующим образом:
# raise an exception try: for i in range(5): for j in range(5): if j == 2 and i == 0: raise StopIteration except StopIteration: pass
3. Проверьте то же условие еще раз
Поскольку одно условие приводит к выходну из одного цикла, проверка одного и того же условия в каждом цикле также является допустимым решением. Вот пример:
# check the same condition again for i in range(5): for j in range(5): if j == 2 and i == 0: break if j == 2 and i == 0: break
Приведенный выше способ работает, но это не очень хорошая идея. Это не эффективно и вынуждает нас делать много лишних операций.
4. Используйте синтаксис For-Else
В Python есть специальный синтаксис: "for-else". Он не популярен, а кто-то даже никогда его не использовал. Потому что все привыкли использовать "else" после "if".
Однако, когда дело доходит до разрыва вложенных циклов. Этот нетрадиционный синтаксис может помочь.
# use the for-else syntax for i in range(5): for j in range(5): if j == 2 and i == 0: break else: # only execute when it's no break in the inner loop continue break
Приведенный выше код использует преимущества техники "for-else", поскольку код под оператором else будет выполняться только тогда, когда внутренний цикл завершится без break.
5. Поместите циклы в функцию
Если мы поместим вложенные циклы в функцию, проблема break становится простой. Потому что мы можем использовать ключевое слово return вместо break.
# make it as a function def check_sth(): for i in range(5): for j in range(5): if j == 2 and i == 0: return check_sth() # Run the function when needed
Как показано выше, это решение выглядит более элегантно. Здесь нет переменных флагов, синтаксиса "try-except" или "for-else" и ненужной проверки условий.
Кроме того, "Turn Predicate Loops into Predicate Functions" - это хорошая практика написания кода, введенная командой компилятора LLVM.
Функции в Python очень гибкие. Мы можем легко определять вложенные функции или замыкания. Поэтому, если вложенные циклы будут использоваться только один раз и в пределах функции, мы можем просто определить их внутри этой функции:
def out_func(): # do something def check_sth(): for i in range(5): for j in range(5): if j == 2 and i == 0: return # do something check_sth() # Run the function when needed # do something
Вывод: Избегайте вложенных циклов
Если не существует элегантных решений для выхода из вложенных циклов, почему бы не избегать написания вложенных циклов?
Используя некоторые вспомогательные функции, мы действительно можем избежать вложенных циклов:
# Avoid nested loops import itertools for i, j in itertools.product(range(5), range(5)): if j == 2 and i == 0: break
Как показано выше, наш предыдущий пример может избежать вложенных циклов с помощью функции itertools.product. Это простой способ получить декартово произведение входных итераций.
К сожалению, этот способ не позволяет избежать всех вложенных циклов. Например, если нам нужно обрабатывать бесконечные потоки данных в наших циклах, он не поможет. Но это все равно хорошая идея, чтобы избежать вложенных циклов и улучшить читабельность наших программ.
Спасибо за прочтение! Какой из способов вы считаете самым полезным? Пишите в комментариях!
Еще больше примеров использования Python и Machine Learning в современных сервисах можно посмотреть в моем телеграм канале. Я пишу про разработку, ML, стартапы и релокацию в UK для IT специалистов.
- Python
- Программирование
- Алгоритмы
- Машинное обучение
- Искусственный интеллект