Циклы – один из главных инструментов любого языка. В Python предусмотрено два базовых вида цикла, один из которых – while. Рассмотрим его, а также для большего понимания картины, еще один. Ведь в сравнении с чем-то похожим значительно легче понять любой материал, не так ли?
Понятие цикла
Цикл необходим, когда определенное действие нужно выполнить несколько раз. Это очень упрощенно, потому что на деле спектр применения циклов значительно шире. В Python два основных вида циклов: for и while. Наиболее популярным является for.
Кроме конкретных действий, зациклить можно разные куски кода до определенного момента. Таковым может быть определенное количество раз или же пока конкретное условие соответствует действительности.
Перед тем, как мы начнем разбирать виды циклов и while, в частности, необходимо еще разобраться, что такое итерация. Это одно повторение действия или их последовательности в ходе текущего цикла в рамках текущего запуска приложения.
Цикл For
Цикл For у нас не является счетчиком, как во многих других языках. Его задача – перебор определенной последовательности значений. Что это означает? Допустим, у нас есть перечень элементов. Сначала цикл берет первый, второй, третий и так далее.
Преимущество этого цикла в Python в том, что не надо определять индекс элемента, чтобы понимать, когда нужно выходить из цикла. Все будет сделано автоматически.
>>> spisok = [10, 40, 20, 30]
>>> for element in spisok:
… print(element + 2)
…
12
42
22
32
В нашем примере мы использовали переменную element после команды for. Вообще, имя может быть каким-угодно. Например, популярное обозначение – i. И при каждой итерации этой переменной будет присвоен определенный объект из списка, который мы назвали соответствующим словом.
В нашем случае список – это последовательность чисел 10,40,20,30. При каждой итерации в переменной оказывается соответствующее значение. Например, как только цикл запускается, переменной element присваивается значение 10. При следующей итерации десятка превращается в число 40, в третий раз – в число 20, и, наконец, при последней итерации цикла превращается в 30.
Сигналом к завершению цикла служит окончание элементов в перечне.
Если же нужно, чтобы цикл осуществил классический перебор значений, как в других языках программирования, следует создать список с последовательностью натуральных чисел до нужного нам значения.
>>> spisok = [1,2,3,4,5]
Или же воспользоваться функцией len(), чтобы определить длину списка. Но в этом случае лучше использовать цикл while, поскольку там не надо использовать переменную.
Если нужно изменить последовательность значений в списке, цикл for и здесь придет на помощь. Для этого надо на каждой итерации присваивать каждому элементу списка соответствующее значение.
Цикл While
В отличие от цикла for, который просто перебирает значения последовательности, цикл while имеет больше применений. Переводится название этого типа циклов, как «пока». То есть, «до тех пор, пока».
Это универсальный цикл, который есть во всех языках программирования. И чем-то он напоминает условный оператор if, который выполняет проверку на предмет соответствия определенному условию. Только в отличие от условного оператора, while выполняет проверку на каждой итерации, а не единожды. И только если условие оказывается ложным, цикл завершается и выполняется та команда, которая следует за ним. Простыми словами, если ситуация, в которой он работает, уже не действительна.
Если изобразить цикл while упрощенно, это делается с помощью такой схемы.
Главная ветка программы (которая выполняется за пределами цикла) на этом рисунке изображена синими прямоугольниками. Бирюзовый же отображает тело цикла. В свою очередь, ромб – это условие, которое проверяется на каждой итерации.
Цикл while может привести к двум исключительным ситуациям:
- Если в начале цикла логическое выражение не возвращает истину, то он просто не начинается, завершившийся еще до выполнения. В целом, такая ситуация нормальная, поскольку при определенных обстоятельствах приложение может не предусматривать наличие выражений тела цикла.
- Если выражение всегда истинное, это может привести к зацикливанию. То есть, к бесконечному прокручиванию цикла. Поэтому в подобных программах всегда должен быть оператор выхода из цикла или программы. Тем не менее, эта ситуация возникнет, если программа смогла определить истинность или ложность определенного условия. Если у нее это не получилось сделать, то возвращается ошибка с завершением программы. Или же можно обработать ошибку, и тогда будет в случае ее возникновения исполняться определенный код.
Вариантов, как обрабатывать ошибку, может быть огромное количество. Например, программа может попросить пользователя ввести данные правильно. Так, если человек указал отрицательное число там, где оно может быть только положительным или же ввел буквы там, где должны быть только цифры, программа может об этом сказать.
Примеры использования цикла While
Приводим пример кода, который обрабатывает ошибку в таком случае.
n = input(«Введите целое число: «)
while type(n) != int:
try:
n = int(n)
except ValueError:
print(«Неправильно ввели!»)
n = input(«Введите целое число: «)
if n % 2 == 0:
print(«Четное»)
else:
print(«Нечетное»)
Помним о том, что в Python для объявления сложных конструкций кода используется двоеточие.
В описанном выше коде мы в качестве условия определили, что должно проверяться, является ли число целым. Если да, то возвращается значение ложь. Если нет, то истина.
Во второй части кода, где используется оператор if, мы использовали оператор %, чтобы найти остаток после операции деления. Далее осуществляется проверка, является ли число четным. Если нет, то остаток равен единице в этом случае. Соответственно, число нечетное.
Простыми словами, описанный выше код сначала проверяет, является ли числом введенная пользователем строка. Если да, то выполняется вторая проверка на предмет наличия остатка от деления на два. Но второй блок не будет выполняться, пока введенное пользователем значение не станет числовым.
То есть, цикл будет регулярно выполняться, пока условие не наступит. В данной ситуации это работает так.
То есть, можно идти от обратного: зацикливать определенное действие до тех пор, пока событие не станет ложным.
Разбор кода
А теперь посмотрим более подробно, как этот код работает. Для этого разберем его пошагово.
- Сначала пользователь вводит строку, которая принимается переменной n.
- С использованием цикла while выполняется проверка типа этой переменной. При первом входе она не равна int. Поэтому в результате проверки обнаруживается, что это условие истинное. Следовательно, осуществляется вход в тело цикла.
- С помощью оператора try мы пробуем преобразовать строку в число. Если это получилось сделать, то ошибка не возникает. Соответственно, нет необходимости обрабатывать ее. Поэтому интерпретатор возвращается к началу цикла, и по результатам проверки оказывается, что оно стало целочисленным. Поэтому переходим к шагу 7
- Если преобразование оказалось безуспешным, то выбрасывается ошибка ValueError. В этом случае поток программы отправляется к обработчику except.
- Пользователь вводит новое значение, которое присваивается переменной n.
- Интерпретатор возвращается к шагу 2 и повторно осуществляется проверка. Если это целочисленное значение, переходим к шагу 7. Если нет, снова осуществляется попытка преобразования согласно пункту 3.
- С помощью оператора if определяется, есть ли остаток после деления числа на 2.
- Если нет, то возвращается текст «четное».
- Если нет, то возвращается текст «нечетное».
Рассмотрим теперь такой пример. Попробуйте определить, сколько раз пройдет этот цикл?
total = 100
i = 0
while i < 5:
n = int(input())
total = total — n
i = i + 1
print(«Осталось», total)
Правильный ответ – 5. Изначально значение переменной i – ноль. Интерпретатор проверяет, равна ли переменная i 4 и меньше. Если да, то возвращается значение истина, и цикл, соответственно, выполняется. Значение увеличивается на единицу.
После первой итерации значение переменной становится 1. Выполняется проверка, и программа понимает, что это число снова меньше 5. Соответственно, тело цикла выполняется уже во второй раз. Поскольку действия аналогичные, то значение также увеличивается на единицу, и переменная теперь равняется 2.
Это значение тоже меньше пяти. Тогда цикл выполняется в третий раз, добавляется к переменной i 1 и ей присваивается значение 3. Это снова меньше пяти. И так доходит до шестой итерации цикла, на которой значение переменной i равняется 5 (ведь изначально она была нулевой, насколько мы помним). Соответственно, проверку это условие не проходит, и осуществляется автоматическое завершение цикла и переход к следующему шагу, который находится за его пределами (или завершению программы, если следующих шагов не предусмотрено).
Цикл может происходит и в обратном направлении. Приводим пример кода, где с каждой последующей итерацией происходит вычитание единицы из текущего значения переменной.
total = 100
while total > 0:
n = int(input())
total = total — n
print(«Ресурс исчерпан»)
Попробуйте догадаться, что делает эта программа! Представим, что в переменной total хранится информация о ресурсе программы. Каждый раз интерпретатор проверяет, есть ли ресурс. Если нет, то выдается текст «Ресурс исчерпан» и программа закрывается. И с каждой итерацией цикла ресурс уменьшается на то число, которое укажет пользователь.
А теперь домашнее задание. Попробуйте изменить описанный выше код таким образом, чтобы переменная физически не могла стать отрицательной.