Как инструкция break влияет на работу цикла

  • Главная

  • Инструкции

  • Python

  • Операторы break, continue и pass в циклах Python 3

При работе с циклами while и for бывает необходимо выполнить принудительный выход, пропустить часть или игнорировать заданные условия. Для первых двух случаев используются операторы break и continue Python, а для игнорирования условий — инструкция pass. Давайте посмотрим на примерах, как работают эти операторы.

Инструкция break в языке программирования Python прерывает выполнение блока кода. Простейший пример:

for j in 'bananafishbones':
    if j == 'f':
        break
    print(j)

Получаем такой вывод:

b
a
n
a
n
a

Как только программа после нескольких итераций доходит до элемента последовательности, обозначенного буквой f, цикл (loop) прерывается, поскольку действует оператор break. Теперь рассмотрим работу этой инструкции в цикле while:

x = 0
while x < 5:
    print(x)
    x += 0.5
print('Выход')

Вывод будет следующий (приводим с сокращениями):

0
0.5

4.0
4.5
Выход

Как только перестает выполняться условие и x становится равным 5, программа завершает цикл. А теперь перепишем код с использованием инструкции break:

x = 0
while True:
    print(x)
    if x >= 4.5:
        break
    x += 0.5
print('Выход')

Результат тот же:

0
0.5

4.0
4.5
Выход

Мы точно так же присвоили x значение 0 и задали условие: пока значение x истинно (True), продолжать выводить его. Код, правда, получился немного длиннее, но бывают ситуации, когда использование оператора прерывания оправданно: например, при сложных условиях или для того, чтобы подстраховаться от создания бесконечного цикла. Уберите из кода выше две строчки:

x = 0
while True:
    print(x)
    x += 0.5
print('Выход')

И перед нами бесконечный вывод:

0
0.5

100
100.5

1000000
1000000.5

И слово в конце (‘Выход’), таким образом, никогда не будет выведено, поскольку цикл не закончится. Поэтому при работе с последовательностями чисел использование оператора break убережет вас от сбоев в работе программ, вызываемых попаданием в бесконечный цикл.

Конструкция с else

Иногда необходимо проверить, был ли цикл исполнен до конца или выход произошел с использованием инструкции break. Для этого добавляется проверка по условию с else. Напишем программу, которая проверяет фразу на наличие запрещенных элементов:

word = input('Введите слово: ')
for i in word:
    if i == 'я':
        print('Цикл был прерван, обнаружена буква я')
        break
else:
    print('Успешное завершение, запрещенных букв не обнаружено')
print('Проверка завершена')

Теперь, если пользователь введет, например, «Привет!», программа выдаст следующее:

Успешное завершение, запрещенных букв не обнаружено
Проверка завершена

Но если во введенном слове будет буква «я», то вывод примет такой вид:

Цикл был прерван, обнаружена буква я
Проверка завершена

Небольшое пояснение: функция input принимает значение из пользовательского ввода (выражение 'Введите слово: ' необходимо только для пользователя, для корректной программы хватило бы и такой строки: word = input ()) и присваивает его переменной word. Последняя при помощи for поэлементно (в данном случае — побуквенно) анализируется с учетом условия, вводимого if.

Оператор continue в Python

Если break дает команду на прерывание, то continue действует более гибко. Его функция заключается в пропуске определенных элементов последовательности, но без завершения цикла. Давайте напишем программу, которая «не любит» букву «я»:

word = input('Введите слово: ')
for i in word:
    if i == 'я':
        continue
    print(i)

Попробуйте ввести, например, «яблоко», в этом случае вывод будет таким:

б
л
о
к
о

Это происходит потому, что мы задали условие, по которому элемент с определенным значением (в данном случае буква «я») не выводится на экран, но благодаря тому, что мы используем инструкцию continue, цикл доходит до последней итерации и все «разрешенные» элементы выводятся на экран. Но в коде выше есть одна проблема: если пользователь введет, например, «Яблоко», программа выведет слово полностью, поскольку не учтен регистр:

Я
б
л
о
к
о

Наиболее очевидное решение в данном случае состоит в добавлении и заглавной буквы в блок if таким образом:

word = input('Введите слово: ')
for i in word:
    if i == 'я' or i == 'Я':
        continue
    print(i)

Оператор pass в Python

Назначение pass — продолжение цикла независимо от наличия внешних условий. В готовом коде pass встречается нечасто, но полезен в процессе разработки и применяется в качестве «заглушки» там, где код еще не написан. Например, нам нужно не забыть добавить условие с буквой «я» из примера выше, но сам этот блок по какой-то причине мы пока не написали. Здесь для корректной работы программы и поможет заглушка pass:

word = input('Введите слово: ')
for i in word:
    if i == 'я':
        pass
else:
    print('Цикл завершен, запрещенных букв не обнаружено')
print('Проверка завершена')

Теперь программа запустится, а pass будет для нас маркером и сообщит о том, что здесь нужно не забыть добавить условие.

Вот и всё, надеемся, скоро break, continue и pass станут вашими верными друзьями в разработке интересных приложений. Успехов! 

Порой обучение продвигается с трудом. Сложная теория, непонятные задания… Хочется бросить. Не сдавайтесь, все сложности можно преодолеть. Рассказываем, как

Не понятна формулировка, нашли опечатку?

Выделите текст, нажмите ctrl + enter и опишите проблему, затем отправьте нам. В течение нескольких дней мы улучшим формулировку или исправим опечатку

Что-то не получается в уроке?

Загляните в раздел «Обсуждение»:

  1. Изучите вопросы, которые задавали по уроку другие студенты — возможно, ответ на ваш уже есть
  2. Если вопросы остались, задайте свой. Расскажите, что непонятно или сложно, дайте ссылку на ваше решение. Обратите внимание — команда поддержки не отвечает на вопросы по коду, но поможет разобраться с заданием или выводом тестов
  3. Мы отвечаем на сообщения в течение 2-3 дней. К «Обсуждениям» могут подключаться и другие студенты. Возможно, получится решить вопрос быстрее!

Подробнее о том, как задавать вопросы по уроку

В этой статье вы познакомитесь с инструкциями break и continue — их еще называют инструкциями управления циклом. 

Для чего нужны break и continue

Инструкции break и continue управляют циклом.

Циклы выполняют блок когда до тех пор, пока условие цикла истинно. Иногда нужно прервать выполнение целого цикла без проверки условия. 

В таких случаях нам помогут инструкции break и continue.

Инструкция break

Инструкция break прерывает цикл, в котором он объявлен. После этого управление программой передается инструкции, которая находится после тела цикла. 

Если инструкция break находится внутри вложенного цикла (цикл в цикле), то прерывается внутренний цикл.

Синтаксис break

break

Блок-схема break

Ниже представлен пример работы инструкции break в циклах for и while.

Пример использования break

# Пример использования break внутри цикла

for val in "строка":
    if val == "о":
        break
    print(val)

print("Конец")

Вывод:

с
т
р
Конец

В этой программе мы итерируем строку «строка». В теле цикла мы проверяем буквы — если это «о», прерываем цикл. Как видите, в выводе напечатаны все буквы до «о». Когда переменная val принимает значение «о», цикл завершается. 

Инструкция continue

Инструкция continue используется для того, чтобы пропустить оставшееся тело цикла текущей итерации. Цикл не завершается, а продолжается со следующей итерации.

Синтаксис continue

continue

Блок-схема continue

Ниже представлен пример работы инструкции continue в циклах for и while.

Пример использования continue

# Пример использования continue внутри цикла

for val in "строка":
    if val == "о":
        continue
    print(val)

print("Конец")

Вывод:

с
т
р
к
а
Конец

Эта программа очень похожа на вышестоящий пример. Единственное отличие — break мы заменили на continue

Мы продолжаем цикл до тех пор, пока не встретим «о» — в этот момент мы пропускаем оставшуюся часть цикла. Как видите, мы напечатали все буквы, кроме «о». 

Добавлено 29 мая 2021 в 18:06

Инструкция break

Хотя вы уже видели инструкцию break в контексте операторов switch (7.4 – Основы работы с оператором switch), она заслуживает более полного рассмотрения, поскольку ее можно использовать и с другими типами инструкций управления порядком выполнения программы. Инструкция break вызывает завершение цикла while, цикла dowhile, цикла for или оператора switch, при этом выполнение продолжается со следующей инструкции после цикла или switch, из которых выполнен выход.

Прекращение выполнения switch

В контексте оператора switch инструкция break обычно используется в конце каждой метки case, чтобы показать, что метка case завершена (что предотвращает проваливание к последующим меткам):

#include <iostream>
 
void printMath(int x, int y, char ch)
{
    switch (ch)
    {
    case '+':
        std::cout << x << " + " << y << " = " << x + y << 'n';
        break; // не проваливаться к следующей метке
    case '-':
        std::cout << x << " - " << y << " = " << x - y << 'n';
        break; // не проваливаться к следующей метке
    case '*':
        std::cout << x << " * " << y << " = " << x * y << 'n';
        break; // не проваливаться к следующей метке
    case '/':
        std::cout << x << " / " << y << " = " << x / y << 'n';
        break;
    }
}
 
int main()
{
    printMath(2, 3, '+');
 
    return 0;
}

Для получения дополнительной информации о проваливании вместе с некоторыми дополнительными примерами смотрите урок «7.5 – Проваливание и область видимости в switch».

Прекращение выполнения цикла

В контексте цикла инструкция break может использоваться для преждевременного завершения цикла. Выполнение продолжается со следующей инструкции после конца цикла.

Например:

#include <iostream>
 
int main()
{
    int sum{ 0 };
 
    // Разрешить пользователю ввести до 10 цифр
    for (int count{ 0 }; count < 10; ++count)
    {
        std::cout << "Enter a number to add, or 0 to exit: ";
        int num{};
        std::cin >> num;
 
        // выход из цикла, если пользователь вводит 0
        if (num == 0)
            break; // exit the loop now
 
        // иначе добавляем число к нашей сумме
        sum += num;
    }
 
    // после break выполнение продолжится здесь
    std::cout << "The sum of all the numbers you entered is: " << sum << "n";
 
    return 0;
}

Эта программа позволяет пользователю ввести до 10 чисел и в конце отображает сумму всех введенных чисел. Если пользователь вводит 0, break приводит к преждевременному завершению цикла (до того, как будут введены 10 чисел).

Вот пример выполнения показанной выше программы:

Enter a number to add, or 0 to exit: 5
Enter a number to add, or 0 to exit: 2
Enter a number to add, or 0 to exit: 1
Enter a number to add, or 0 to exit: 0
The sum of all the numbers you entered is: 8

break также является распространенным способом выхода из преднамеренного бесконечного цикла:

#include <iostream>
 
int main()
{
    while (true) // бесконечный цикл
    {
        std::cout << "Enter 0 to exit or anything else to continue: ";
        int num{};
        std::cin >> num;
 
        // выход из цикла, если пользователь вводит 0
        if (num == 0)
            break;
    }
 
    std::cout << "We're out!n";
 
    return 0;
}

Пример выполнения показанной выше программы:

Enter 0 to exit or anything else to continue: 5
Enter 0 to exit or anything else to continue: 3
Enter 0 to exit or anything else to continue: 0
We're out!

break против return

Начинающим программистам иногда трудно понять разницу между break и return. Инструкция break завершает выполнение switch или цикла, и выполнение продолжается с первой инструкции после switch или цикла. Инструкция return завершает выполнение всей функции, в которой находится цикл, и выполнение продолжается в точке, где эта функция была вызвана.

#include <iostream>
 
int breakOrReturn()
{
    while (true) // бесконечный цикл
    {
        std::cout << "Enter 'b' to break or 'r' to return: ";
        char ch;
        std::cin >> ch;
 
        if (ch == 'b')
            break; // выполнение продолжится с первой инструкции за пределами цикла
 
        if (ch == 'r')
            return 1; // return заставит функцию немедленно вернуться в вызывающую
                      // функцию (в данном случае main())
    }
 
   // прерывание цикла приводит к возобновлению выполнения здесь
 
    std::cout << "We broke out of the loopn";
 
    return 0;
}
 
int main()
{
    int returnValue{ breakOrReturn() };
    std::cout << "Function breakOrReturn returned " << returnValue << 'n';
 
    return 0;
}

Вот результаты двух запусков этой программы:

Enter 'b' to break or 'r' to return: r
Function breakOrReturn returned 1
Enter 'b' to break or 'r' to return: b
We broke out of the loop
Function breakOrReturn returned 0

Инструкция continue

Инструкция continue предоставляет удобный способ завершить текущую итерацию цикла без завершения всего цикла.

Вот пример использования continue:

#include <iostream>
 
int main()
{
    for (int count{ 0 }; count < 10; ++count)
    {
        // если число делится на 4, пропустить эту итерацию
        if ((count % 4) == 0)
            continue; // перейти к следующей итерации
 
        // если число не делится на 4, продолжаем
        std::cout << count << 'n';
 
        // инструкция continue переходит сюда
    }
 
    return 0;
}

Эта программа печатает все числа от 0 до 9, которые не делятся на 4:

1
2
3
5
6
7
9

Инструкции continue работают, заставляя текущую точку выполнения переходить в конец текущего цикла.

В случае цикла for конечное выражение цикла for по-прежнему выполняется после continue (поскольку это происходит после конца тела цикла).

Будьте осторожны при использовании инструкции continue с циклами while или dowhile. Эти циклы обычно изменяют значения переменных, используемых в условии, внутри тела цикла. Если использование инструкции continue приводит к пропуску этих строк, цикл может стать бесконечным!

Рассмотрим следующую программу:

#include <iostream>
 
int main()
{
    int count{ 0 };
    while (count < 10)
    {
        if (count == 5)
            continue; // переход к концу тела цикла
 
        std::cout << count << ' ';
 
        ++count; // эта инструкция никогда не выполняется после того,
                 // как счетчик достигнет значения 5
 
        // инструкция continue переходит сюда
    }
 
    return 0;
}

Эта программа предназначена для печати всех чисел от 0 до 9, кроме 5. Но на самом деле она печатает:

0 1 2 3 4

а затем переходит в бесконечный цикл. Когда count равно 5, оператор if принимает значение true, а continue приводит к переходу выполнения в конец цикла. Переменная count не увеличивается. Следовательно, на следующей итерации счетчик по-прежнему равен 5, условие оператора if так же равно true, и программа продолжает цикл бесконечно.

Конечно, вы уже знаете, что если у вас есть очевидная переменная счетчика, вам следует использовать цикл for, а не циклы while или dowhile.

Споры по поводу использования break и continue

Многие учебники предостерегают читателей от использования break и continue в циклах как потому, что они заставляют путь выполнения прыгать, так и потому, что они могут затруднить отслеживание логики пути выполнения. Например, break в середине сложной логической части может быть пропущен, или может быть неочевидно, при каких условиях он должен сработать.

Однако при разумном использовании break и continue могут помочь сделать циклы более читаемыми, уменьшив количество вложенных блоков и уменьшив потребность в сложной логике циклов.

Например, рассмотрим следующую программу:

#include <iostream>
 
int main()
{
    int count{ 0 };            // подсчитывает, сколько раз цикл повторяется
    bool keepLooping { true }; // управляет, завершить цикл, или нет
    while (keepLooping)
    {
        std::cout << "Enter 'e' to exit this loop or any other character to continue: ";
        char ch{};
        std::cin >> ch;
 
        if (ch == 'e')
        {
            keepLooping = false;
        }
        else
        {
            ++count;
            std::cout << "We've iterated " << count << " timesn";
        }
    }
 
    return 0;
}

Эта программа использует логическую переменную, чтобы контролировать, продолжать цикл или нет, а также вложенный блок, который запускается только в том случае, если пользователь не выходит.

А вот версия, которую легче понять, и которая использует инструкцию break:

#include <iostream>
 
int main()
{
    int count{ 0 }; // подсчитывает, сколько раз цикл повторяется
    while (true) // цикл до завершения пользователем
    {
        std::cout << "Enter 'e' to exit this loop or any other character to continue: ";
        char ch{};
        std::cin >> ch;
 
        if (ch == 'e')
            break;
 
        ++count;
        std::cout << "We've iterated " << count << " timesn";
    }
 
    return 0;
}

В этой версии, использующей одну инструкцию break, мы избежали использования логической переменной (и необходимости понимать ее предполагаемое использование, и где изменяется ее значение), оператора else и вложенного блока.

Минимизация количества используемых переменных и уменьшение количества вложенных блоков улучшают понятность кода больше, чем break или continue навредят ему. По этой причине мы считаем приемлемым разумное использование break и continue.

Лучшая практика


Используйте break и continue, когда они упрощают логику цикла.

Споры по поводу использования ранних возвратов

В отношении инструкций return можно привести аналогичный аргумент. Инструкция return, которая не является последней инструкцией в функции, называется ранним возвратом. Многие программисты считают, что ранних возвратов следует избегать. Функция, которая имеет только одну инструкцию return в нижней части функции, отличается простотой – вы можете предположить, что функция без отклонений будет принимать свои аргументы, выполнять любую реализованную логику и возвращать результат. Наличие дополнительных инструкций return усложняет логику.

Контраргумент заключается в том, что использование ранних возвратов позволяет вашей функции завершиться, как только она будет выполнена, что уменьшает необходимость чтения ненужной логики и сводит к минимуму потребность во вложенных условных блоках, что делает ваш код более читабельным.

Некоторые разработчики выбирают золотую середину и используют ранние возвраты только в верхней части функции для проверки параметров (перехвата неверных аргументов), а затем, после этого только одну инструкцию return.

Наша позиция заключается в том, что ранние возвраты скорее полезны, чем вредны, но мы признаем, что в этой практике есть немного искусства.

Лучшая практика


Используйте ранние возвраты, если они упрощают логику вашей функции.

Теги

breakC++ / CppcontinueLearnCppДля начинающихОбучениеПрограммированиеРанний возвратЦикл

#Руководства

  • 4 апр 2023

  • 0

Они есть практически в каждом языке программирования, но в Python с ними работать приятнее всего. Как, впрочем, и со всем остальным.

Иллюстрация: Катя Павловская для Skillbox Media

Иван Стуков

Журналист, изучает Python. Любит разбираться в мелочах, общаться с людьми и понимать их.

Код в Python обычно выполняется последовательно: первая строка, потом вторая, третья и так далее. Но некоторые конструкции позволяют нарушать этот порядок, чтобы совершать более сложные операции.

Например, циклы выполняют один и тот же блок кода несколько раз. В Python есть два основных вида циклов: while и for. О них и поговорим.

  • Как работают циклы
  • Цикл while в Python
  • Цикл for в Python
  • Функция range()
  • Однострочный цикл: генератор списков
  • Прерывание цикла: ключевое слово break
  • Пропуск части цикла: ключевое слово continue
  • Последнее действие в цикле: ключевое слово else
  • Бесконечный цикл
  • Как сделать аналог do while в Python
  • Вложенные циклы в Python

Любой цикл состоит из двух обязательных элементов:

  • условие — начальный параметр; цикл запустится только при его выполнении и закончится, как только условие перестанет выполняться;
  • тело — сама программа, которая выполняется внутри цикла.

Схематически его можно представить так:

Инфографика: Майя Мальгина для Skillbox Media

В синтаксисе Python в конце строки с условием ставится двоеточие, а всё тело выделяется отступом (табуляцией или четырьмя пробелами).

программа до цикла
условие:
	первая строка тела
	вторая строка тела
программа после цикла

While — наиболее простой и понятный вид цикла. Его ещё называют циклом с предусловием.

x = 1
while x < 5:
    print(x)
    x += 1  # Означает то же самое, что x = x + 1
>>> 1
>>> 2
>>> 3
>>> 4

С языка Python на русский программу можно перевести так: «Пока икс меньше пяти, печатай икс и прибавляй к нему единицу».

Но в простоте while кроется и опасность: его легко сделать бесконечным. Например, если в коде выше мы уберём x += 1, то получится вот так:

# Этот код будет выполняться бесконечно
x = 1
while x < 5:
    print(x)

Здесь с переменной x ничего не происходит. Она всегда равна единице, поэтому условие цикла никогда не перестанет выполняться. Соответственно, он никогда не завершится.

Чтобы избежать таких ситуаций, при использовании while нужно следить: перестанет ли когда-нибудь выполняться условие? Ещё можно использовать оператор break — о нём мы расскажем чуть позже.

Цикл for программисты используют куда чаще, чем while. Для него мы устанавливаем не условие в чистом виде, а некий массив данных: список, кортеж, строку, словарь, диапазон или любой другой итерируемый объект.

На каждой итерации цикла программа как бы спрашивает: «Остались ли в объекте ещё элементы, по которым я не прошла?»

Допустим, у нас есть список с числами: [14, 101, -7, 0]. Мы можем использовать его вместе с for, чтобы напечатать каждый элемент по отдельности.

num_list = [14, 101, -7, 0]
for number in num_list:
    print(number)
>>> 14
>>> 101
>>> -7
>>> 0

Здесь переменная number обновляется при каждом новом витке цикла. Сначала она хранит в себе первый элемент, потом второй, и так — пока список не закончится.

Как и любую другую переменную, мы могли назвать number как угодно. Часто используют буквы i, j и k. Если внутри цикла мы ни разу не обращаемся к этой переменной, то среди питонистов её принято обозначать символом нижнего подчёркивания _.

Когда нужно применить for к числовому промежутку, его можно задать диапазоном. Для этого используют функцию range(). В неё можно передать от одного до трёх аргументов.

Если аргумент один, то сформируется диапазон от нуля до числа, предшествующего значению аргумента.

for i in range(3):
    print(i)
>>> 0
>>> 1
>>> 2

Если аргумента два, то сформируется диапазон от значения первого аргумента до числа, предшествующего значению второго аргумента.

for i in range(23, 26):
    print(i)
>>> 23
>>> 24
>>> 25

Если аргумента три, то первые два работают, как в прошлом случае. Третий же означает шаг, с которым числа следуют друг за другом.

for i in range(10, 20, 3):
    print(i)
>>> 10
>>> 13
>>> 16
>>> 19

Если в теле цикла for выполняется всего одно действие, синтаксис Python позволяет сократить его запись до:

i for i in iterable_object

Это синтаксический сахар, который не добавляет новой функциональности, но влияет на внешний вид кода. Так можно легко и быстро генерировать списки.

num_list = [i for i in range(1, 11)]
print(num_list)
>>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

В такую конструкцию также можно добавить дополнительное условие. Сделаем генератор, который будет выводить только чётные числа. При этом не будем создавать переменную для получившегося списка, а сразу напечатаем его.

print([i for i in range(1, 11) if i % 2 == 0])
>>> [2, 4, 6, 8, 10]

Конструкция if i % 2 == 0 означает: «если при делении i на 2 остаток равен 0».

С самой переменной i тоже можно проводить операции. Используем предыдущий генератор, но теперь будем выводить не сами чётные числа, а их квадраты.

print([i ** 2 for i in range(1, 11) if i % 2 == 0])
>>> [4, 16, 36, 64, 100]

Главное при таком подходе — сильно не увлекаться. Если код тяжело прочесть и понять (например, когда к i применяется сразу несколько функций и методов и вдобавок задаётся сложное условие), то лучше разбить его на несколько строк. Понятность важнее лаконичности.

Бывают случаи, когда нужно завершить цикл принудительно, даже если его условие всё ещё выполняется. В таких случаях используют ключевое слово break.

Возьмём строку Hi, loop! и будем выводить каждый её символ. Если встретим запятую, досрочно завершим цикл.

string = 'Hi, loop!'
for i in string:
    if i == ',':
        break
    print(i)
>>> H
>>> i

Если же в строке запятой не будет, то цикл пройдёт по каждому её символу — и только потом завершится.

string = 'Hi loop!'
for i in string:
    if i == ',':
        break
    print(i)
>>> H
>>> i
>>>  
>>> l
>>> o
>>> o
>>> p
>>> !

Иногда возникает необходимость принудительно начать следующий шаг цикла, пропустив часть строк в его теле. Для таких случаев существует ключевое слово continue.

Возьмём числа от 1 до 10 включительно и выведем из них только те, которые не делятся ни на 2, ни на 3.

for i in range(1, 10):
    if i%2 == 0 or i%3 == 0:
        continue
    print(i)
>>> 1
>>> 5
>>> 7

Как видим, если срабатывает условие if (то есть если число делится на 2 или на 3 без остатка), то оставшаяся часть тела не работает — и i не печатается.

Обычно ключевое слово else употребляют в связке с if, но у него есть и другое применение. Его можно использовать вместе с while или for. В таком случае else-код выполнится после того, как пройдут все витки цикла.

Если же цикл досрочно прервётся из-за break, то часть программы в else не выполнится.

Вспомним наш код со строкой Hi, loop! и добавим к нему else.

string = 'Hi, loop!'
for i in string:
    if i == ',':
        break
    print(i)
else:
    print('Цикл завершился без break')
>>> H
>>> i

В строке была запятая, сработал break — не выполнилось else-условие. Теперь уберём из неё запятую и посмотрим, что получится.

string = 'Hi loop!'
for i in string:
    if i == ',':
        break
    print(i)
else:
    print('Цикл завершился без break')
>>> H
>>> i
>>>  
>>> l
>>> o
>>> o
>>> p
>>> !
>>> Цикл завершился без break

Цикл прошёл все свои итерации, завершился самостоятельно, и поэтому код в else выполнился. Он также будет работать, если цикл не совершил ни одного витка.

while 1 == 0:
    print('Эта строка никогда не выполнится')
else:
    print('Цикл завершился без break')
>>> Цикл завершился без break

Иногда использовать бесконечный цикл может быть хорошей идеей. Например, мы пишем игру: она должна работать до тех пор, пока игрок из неё не выйдет. В этом случае в условии выхода нужно будет прописать break.

Чтобы цикл был бесконечным, его условие должно выполняться всегда. Это можно сделать разными способами.

# Способ №1 — «пока истинно»
while True:
	pass  # pass — оператор-заглушка, который ничего не делает

Если сделать while False, то цикл, наоборот, никогда не начнётся.

# Способ №2 — «пока проверяемое значение — любое ненулевое число»
while 1:
	pass
while -4:
	pass
while 2023:
	pass

Если сделать while 0, то цикл никогда не начнётся.

# Способ №3 — «пока проверяемое значение — непустой элемент»
while 'string':
	pass
while [False, 'list', 0]:
	pass

Если после while поставить пустой элемент — например, строку str() или список list(), то цикл никогда не начнётся.

# Способ №4 — корректное уравнение
while 1 == 1:
	pass
while 0 != 1:
	pass

Альтернативный подход — поместить после while переменную, в которой лежит подходящее условие. Например:

# Способ №1
condition = True
while condition:
	pass
# Способ №2
condition = 1
while condition:
	pass
# Способ №3
condition = 'string'
while condition:
	pass

В таких случаях для выхода из цикла можно не использовать оператор break, а заменить значение в переменной condition на False, 0, None или любой пустой элемент. Цикл закончит последний виток и завершится, потому что условие больше не будет выполняться.

Такой подход применяется, когда нужно завершить цикл из других мест программы: например, из функции или вложенного цикла. Ещё одно отличие: так как цикл завершается «естественно», без оператора break, в нём выполнится else-код (если он есть).

condition = True
x = 0
while condition:
    print(x)
    x += 1
    if x == 3:
        condition = False
else:
    print('Цикл завершился без break')
>>> 0
>>> 1
>>> 2
>>> Цикл завершился без break

В некоторых языках программирования есть ещё один вид цикла — с постусловием. Он всегда проходит хотя бы один виток и только после этого проверяет, выполняется ли условие. Вот его схема:

Инфографика: Майя Мальгина для Skillbox Media

В Java и C++ такое достигается с помощью конструкции do while, но в Python её нет. Зато можно сделать аналог. Для этого нужно использовать бесконечный цикл, а внутри его тела прописать условие завершения.

x = 12
while True:
    x += 1
    print(x)
    if x > 5:
        break
>>> 13

Каким бы ни было значение x, такой цикл пройдёт хотя бы один виток. А это и есть постусловие.

Циклы в Python можно вкладывать друг в друга — то есть в теле одного цикла вызывать другой. Логика программы при этом усложняется.

Инфографика: Майя Мальгина для Skillbox Media

Можно вкладывать друг в друга сколько угодно циклов. При этом для каждого нового уровня вложенности нужно увеличивать отступ. Выглядит это так:

while condition:
    pass
    while inner_condition:
        pass
    pass

Напишем программу, которая будет выводить номер итерации внешнего и внутреннего цикла.

for i in range(3):
    print(f'Итерация внешнего цикла: {i}')
    for j in range(2):
        print(f'Итерация внутреннего цикла: {j}')
>>> Итерация внешнего цикла: 0
>>> Итерация внутреннего цикла: 0
>>> Итерация внутреннего цикла: 1
>>> Итерация внешнего цикла: 1
>>> Итерация внутреннего цикла: 0
>>> Итерация внутреннего цикла: 1
>>> Итерация внешнего цикла: 2
>>> Итерация внутреннего цикла: 0
>>> Итерация внутреннего цикла: 1

  • Циклы — один из основных инструментов любого Python-разработчика. С их помощью всего за пару строчек кода можно совершить сразу множество повторяющихся действий.
  • Циклы состоят из условия и тела. Код в теле выполняется только до тех пор, пока соблюдено условие.
  • В Python есть два вида циклов: while и for. В while условие задаётся явным образом. В for перебирается каждый элемент коллекции.
  • К обоим видам можно применять разные операторы: break для прерывания, continue для пропуска части тела, else для совершения последнего действия перед выходом из цикла.
  • Циклы можно делать бесконечными (тогда программа никогда не завершится или завершится только при выполнении определённого условия) и вкладывать друг в друга.

Научитесь: Профессия Python-разработчик
Узнать больше

Понравилась статья? Поделить с друзьями:

А вот и еще наши интересные статьи:

  • Эзокар 40 инструкция по применению отзывы
  • Прокурор невского района санкт петербурга официальный сайт руководство
  • Great wall hover ремонт руководство по ремонту скачать
  • Ципрофлоксацин эко инструкция по применению таблетки 500 мг инструкция
  • Три уровня руководства организацией

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии