Найти тему
Langis программист

Управляющие операторы continue, break и else

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

Break

Оператор «break» используется для прерывания выполнения цикла.

В данном примере на консоль выведено только «1», поскольку в первой итерации выполнился оператор «break», и цикл был прерван. Если в примере с лестницей поднявшись на 3-й этаж человек воспользуется лифтом, код можно изменить следующим образом:

-2
-3

Здесь по достижению 3-го этажа используется оператор «break», который прерывает цикл подъема по лестнице. Обратите внимание, что при использовании оператора «break» во вложенном цикле, внешний цикл прерван не будет:

-4

Результат работы нашего кода в консоли:

-5

В приведенном примере так же видно, что при помощи «break» можно прервать бесконечный цикл. Эта особенность может быть полезна для создания циклов с постусловием. Вы уже могли заметить, что цикл «while» выполняет проверку условия перед выполнением тела цикла, поэтому возможна ситуация, когда условие будет изначально ложно и тело цикла не выполнится ни разу. В других языках для избежания подобной ситуации можно использовать цикл «do … while» («цикл с постусловием»), в котором сначала выполняется тело цикла, а потом проверяется условие. В Python такого цикла нет, но его несложно составить самому. Допустим, мы хотим сделать цикл с постусловием из другого, ранее созданного цикла «while»:

-6

Для этого заменим условие цикла на «while», что сделает его бесконечным, и поместим оператор «break» в условную конструкцию, использующую условие, противоположное изначальному, в конце тела цикла:

-7

Если бы мы использовали изначальное условие завершения цикла «number < 5», оператор «break» прекращал бы выполнение цикла для всех значений «number», которые нам подходят (1, 2, 3, 4, т. е. < 5), и делал бы цикл бесконечным для всех неподходящих значений (>= 5). Поэтому условие необходимо заменить на противоположное. Другими словами, в изначальном цикле условие указывало на необходимость продолжения повторений, а в цикле с постусловием нам нужно, чтобы оно указывало на необходимость их прекращения. Хорошим примером для понимания

подобного поведения является сам язык. Одно и тоже мы можем сказать двумя способами:

■ Я буду продолжать радоваться пока мне не исполнится 100 лет.

■ Я прекращу радоваться, когда мне исполнится 100 лет. В нашем случае очевидно, что противоположное условие можно получить, используя другой оператор сравнения («>=»), но для более сложных условий разумнее изменять условие, используя логический оператор «not»:

if not (number < 5):

На примере полученного цикла видно, что его тело выполнится один раз, даже если условие «number < 5» изначально ложно:

-8

Continue

Оператор «continue» используется для прерывания текущей итерации цикла. Это полезно, если необходимо опустить некоторые итерации, и позволяет избежать

вложенности кода. Рассмотрим обе ситуации. Допустим у нас есть цикл, который выводит пять последовательных чисел:

-9

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

-10

Результат работы нашего кода в консоли:

-11

Для рассмотрения избегания вложенности кода предположим, что необходимо определить, какие из чисел от 0 до 300 делятся на 3, на 3 и 5 или на 3, 5 и 7 одновременно. Тогда код будет выглядеть следующим образом:

-12

Здесь последняя инструкция находится на 3-м уровне вложенности, т. е. он вложен одновременно в 3 конструкции. Используя «continue», можно разделить эти конструкции, заканчивая итерацию, если условие ложно:

-13
-14

Преимущество такой конструкции в том, что она позволяет одновременно разделить условия, упростив их, и понизить уровень вложенности кода, тем самым упростить его прочтение. Как и оператор «break», «continue» завершает итерацию только для вложенного цикла, в то время как итерация внешнего цикла продолжается.

Else

В отличие от условных конструкций, в которых «else» выполняется только если условие ложно, «else» в циклах выполняется в том случае, когда цикл был успешно завершен. Например, ребенок, посчитавший от 1 до 5, может сказать, что он посчитал от 1 до 5:

-15
-16

Неочевидно, зачем использовать этот блок если «print()» можно расположить вне тела цикла и результат будет таким же, однако если ребенок забыл несколько цифр, например 4 и 5, он не сможет посчитать дальше и сказать, что посчитал от 1 до 5:

-17

В таком случае цикл не будет считаться успешно завершенным и блок «else» не будет выполнен. Кроме того, прервать успешное выполнение цикла могут операторы «raise» и «return» (подробнее о «return» будет рассказано в следующих модулях).