Python - элегантный язык программирования. Но у него есть слабые стороны. Иногда Python не так элегантен, как должен быть. Например, когда нам нужно выйти из вложенных циклов: break может помочь выйти только из внутреннего цикла. Можем ли мы напрямую выйти из двух вложенных циклов одновременно? Есть ли в Python какие-то встроенные ключевые слова или приемы для этого? К сожалению, встроенная поддержка этой операции отсутствует. В Python нет такой возможности, но она есть в других языках, например, PHP: В PHP ключевое слово break имеет параметр, который определяет, из скольких вложенных циклов нужно выйти. Значение по умолчанию равно 1, что означает выход из самого внутреннего цикла. Поскольку Python очень гибкий, у нас есть много других способов получить тот же результат без встроенной поддержки. В этой статье будут представлены 5 способов выхода из вложенных циклов в Python. А в конце будет упомянуто, как избежать проблемы вложенных циклов, если это возможно.  1. Добавьте флаг Определим переменную и используем ее в качестве флага. Рассмотрим простой пример: Как показано выше, переменная break_out_flag - это флаг, сообщающий программе, когда ей следует выйти из внешнего цикла. Это работает, но код загрязняется, поскольку мы добавляем новую переменную для решения простой задачи.  Давайте рассмотрим другие варианты. 2. Бросить исключение Если мы не можем использовать ключевое слово break, почему бы не реализовать выход из циклов другим способом? С помощью методов обработки исключений в Python мы можем выйти из вложенных циклов следующим образом: 3. Проверьте то же условие еще раз Поскольку одно условие приводит к выходну из одного цикла, проверка одного и того же условия в каждом цикле также является допустимым решением. Вот пример: Приведенный выше способ работает, но это не очень хорошая идея. Это не эффективно и вынуждает нас делать много лишних операций.  4. Используйте синтаксис For-Else В Python есть специальный синтаксис: "for-else". Он не популярен, а кто-то даже никогда его не использовал. Потому что все привыкли использовать "else" после "if". Однако, когда дело доходит до разрыва вложенных циклов. Этот нетрадиционный синтаксис может помочь. Приведенный выше код использует преимущества техники "for-else", поскольку код под оператором else будет выполняться только тогда, когда внутренний цикл завершится без break. 5. Поместите циклы в функцию Если мы поместим вложенные циклы в функцию, проблема break становится простой. Потому что мы можем использовать ключевое слово return вместо break. Как показано выше, это решение выглядит более элегантно. Здесь нет переменных флагов, синтаксиса "try-except" или "for-else" и ненужной проверки условий. Кроме того, "Turn Predicate Loops into Predicate Functions" - это хорошая практика написания кода, введенная командой компилятора LLVM. Функции в Python очень гибкие. Мы можем легко определять вложенные функции или замыкания. Поэтому, если вложенные циклы будут использоваться только один раз и в  пределах функции, мы можем просто определить их внутри этой функции: Вывод: Избегайте вложенных циклов Если не существует элегантных решений для выхода из вложенных циклов, почему бы не избегать написания вложенных циклов?  Используя некоторые вспомогательные функции, мы действительно можем избежать вложенных циклов: Как показано выше, наш предыдущий пример может избежать вложенных циклов с помощью функции itertools.product. Это простой способ получить декартово произведение входных итераций. К сожалению, этот способ не позволяет избежать всех вложенных циклов. Например, если нам нужно обрабатывать бесконечные потоки данных в наших циклах, он не поможет. Но это все равно хорошая идея, чтобы избежать вложенных циклов и улучшить читабельность наших программ. Спасибо за прочтение! Какой из способов вы считаете самым полезным? Пишите в комментариях! Еще больше примеров использования Python и Machine Learning в современных сервисах можно посмотреть в моем телеграм канале. Я пишу про разработку, ML, стартапы и релокацию в UK для IT специалистов. ML Lead, Tech Entrepreneur, Kaggle Master