Циклы, как и условные операторы, составляют неотъемлемую часть структурного программирования. Благодаря ним можно повторно выполнять какие-либо блоки кода. Это востребовано довольно часто. Например, когда необходимо последовательно обрабатывать числа, введенные пользователем, и добавлять их к общей сумме, либо выводить на экран квадраты натуральных чисел.
Цикл while
Цикл "while" означает "пока" в контексте "пока есть это условие, выполняем те действия".
Считается, что цикл while является универсальным. Он присутствует в большинстве языков программирования, таких как Python, которые поддерживают структурное программирование. Его общий синтаксис для всех языков выглядит следующим образом:
while логическое_выражение { выражение 1; … выражение n; }
Здесь наблюдается сходство с условными операторами if. Однако в отличие от них, тело цикла может выполняться многократно. Для if блок кода исполняется лишь раз, если логическое условие истинно. После этого выполнение программы продолжается ниже конструкции if.
Для while, после выполнения тела цикла, управление возвращается к его началу для проверки условия. При истинности условия тело выполняется снова, и так продолжается до тех пор, пока условие не станет ложным.
Цикл прекращается, когда его условие становится ложным, то есть выполнение цикла больше не оправдано. В этом случае программа выходит из цикла и продолжает выполнение кода ниже него.
Ниже приведена блок-схема цикла while.
Основная логика программы обозначена голубыми прямоугольниками, в то время как заголовок цикла представлен ромбом, а тело цикла – бирюзовым прямоугольником.
При работе с циклом while могут возникнуть два исключительных случая:
- Если при первой проверке цикла условие окажется ложным, тело цикла не будет выполнено ни разу. Это считается нормальным, так как в определённых ситуациях выполнение тела может быть не нужно.
- Если условие while никогда не становится ложным, цикл будет бесконечно выполняться, если только в его теле нет команды принудительного выхода (break) или завершения программы — quit() или exit() в Python. Если цикл зацикливается бесконечно, программа может зависнуть без возможности самостоятельного завершения.
Напомним пример из урока про исключения, где пользователь должен ввести целое число. Так как функция input() возвращает строку, то ее необходимо преобразовать в целочисленный тип с помощью int(). В случае ввода неподходящих символов возникнет исключение ValueError, после чего программа завершится.
Другими словами, если программа подразумевала дальнейшую работу с числом (например, проверку на четность) и оно не было введено, единственным дальнейшим шагом было бы завершение программы.
Тем не менее, можно многократно попросить пользователя правильно ввести число, пока он не сделает это. Вот пример такого кода:
n = input("Введите целое число: ") while type(n) != int: try: n = int(n) except ValueError: print("Неправильно ввели!") n = input("Введите целое число: ") if n % 2 == 0: print("Четное") else: print("Нечетное")
Примечание 1. Помните, что в Python в конце заголовков сложных инструкций всегда ставится двоеточие.
Примечание 2. В выражении type(n) != int
используется функция type() для проверки типа переменной n.
Если тип не int, то переменная n является строкой, что делает выражение истинным. Если же n равна int, то выражение ложное.
Примечание 3. В Python оператор % используется для нахождения остатка от деления. Четные числа делятся на 2 без остатка, результат ноль. Для нечетных чисел остаток равен единице.
Рассмотрим алгоритм работы программы: введенные данные, будучи строками, присваиваются переменной n. Заголовок while проверяет тип n. При первом входе в цикл тип n всегда строка, а не int, что делает выражение истинным и позволяет войти в тело цикла.
Внутри блока try происходит попытка преобразовать строку в целое число. Если она успешна, ветка except не выполняется, и цикл возвращает управление к заголовку while.
Теперь n – это целое число, и тип int соответствует: выражение type(n) != int
возвращает ложь, завершая
цикл. Затем выполнение программы переходит к оператору if-else. Здесь могла быть любая другая конструкция, не обязательно if-else.
Если преобразование в try не удалось и выбросило исключение ValueError, выполнение переходит к ветке except, запросив повторный ввод данных. Теперь n содержит новое значение.
После завершения except заголовок цикла снова проверяет логическое выражение. Оно возвращает True, так как n все еще строка.
Цикл завершается, когда n успешно преобразуется в число.
Теперь приведем еще один пример:
total = 100 i = 0 while i < 5: n = int(input()) total = total - n i = i + 1 print("Осталось", total)
Сколько раз выполнится цикл? Пять итераций.
- Сначала i равно 0. Условие i < 5 истина, выполняется тело цикла. i увеличивается на 1.
- Теперь i равно 1. Это меньше пяти, тело цикла повторно выполняется, i становится 2.
- Два меньше пяти. Цикл исполняется в третий раз, i равно 3.
- Три меньше пяти. i становится 4.
- Четыре меньше пяти, выполняется тело цикла, i становится 5.
Шестая итерация начинается с проверки i < 5, условие ложное, цикл прекращается и его тело не выполняется.
Цель данного цикла – последовательное уменьшение переменной total на введенные числа. Здесь i служит счетчиком итераций цикла, а в других языках используется цикл for, так называемый "цикл со счетчиком". Преимущество for в том, что внутри тела цикла счетчик изменяется автоматически.
В Python также есть цикл for, но он не предполагает использование счетчика. Цель этого цикла – перечисление элементов последовательностей и других сложных объектов. Мы изучим его в следующих уроках.
Циклу while наличие счетчика не обязательно. Например, числа вводятся до тех пор, пока total положителен. Тогда код будет таким:
total = 100 while total > 0: n = int(input()) total = total - n print("Ресурс исчерпан")
Сколько раз выполнится цикл? Это зависит от вводимых значений, поэтому в цикле со счетчиком число итераций известно, а без счетчика – неизвестно.
Главное правило для цикла while – в его теле должны происходить изменения переменных, проверяемых в условии, чтобы в какой-то момент выражение в заголовке стало ложным. Иначе программа зациклится.
Примечание 1. В выражениях total = total - n
и i = i + 1
можно использовать
сокращенную запись: total -= n
и i += 1
соответственно.
Примечание 2. Счетчик может изменяться произвольно. Например, чтобы вывести числа, кратные пяти от 100 до 0, итерирование будет выполняться с
помощью i = i - 5
или i -= 5
.
Примечание 3. Для счетчиков обычно используют переменные с именами i и j. Однако можно использовать любые названия.
Практическая работа
- Модифицируйте последний пример так, чтобы переменная total не принимала отрицательных значений. Например, если после вычитания она становится 25, и пользователь вводит 30, программа должна сообщить о невозможности выполнения действия и завершить цикл.
- Используя цикл while, выведите степени числа 2 от 0 до 20. Возведение в степень в Python обозначается символами **. Пример вывода:
... 32 64 128 256 512 1024 ...