Инструкция цикла while

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

Пример: Дано натуральное число, нужно определить количество цифр числа.

Решение: Один из способов решения, это метод целочисленного деления на 10. Нужно многократно отбрасывать последнюю из цифр и при каждом шаге цикла, пока число не будет равно 0.

number = 123
print(number//10) # остается 12
print(number//100) # остается 1
print(number//1000) # остается 0
# Итого 3 итерации и 3 числа в цифре
Но сколько раз надо повторить указанные действия? – Неизвестно. Именно в таких случаях и применяется инструкция while.
Структура:

while < выражение условие >:
< блок инструкций >

Инструкция while продолжает повторять блок инструкций (обычно с отступами) до тех пор, пока условное выражение продолжает возвращать истину. Как только в результате проверки будет получено ложное значение, управление будет передано первой инструкции, расположенной сразу же за вложенным блоком тела цикла while. Цикл while является инструкцией цикла с предусловием.

Применим к нашей задаче:
number = int(input())
count = 0
while number > 0:
    number //= 10
    count += 1
print(count)
Для циклов применимы специальные инструкции:

  • break - прерывает выполнение цикла, управление переходит к первой инструкции после блока цикла;
  • continue - прерывает выполнение итерации цикла и производит переход в начало цикла (в строку заголовка);
  • pass ничего не делает, используется в качестве пустого блока инструкции, когда он обязателен;
  • else - блок выполняется когда выход из цикла производится по < выражению условию >, а не инструкцией break (обычно не используется).
Расширенная структура инструкции while:

while < выражение условие >:
if < выражение условие 1>:
break elif < выражение условие 2>:
continue else: pass
else:
< блок инструкций else >

Пример: Считывать данные из консоли, до тех пор пока не будет передан сигнал "END", если получено целое число то возвести его в квадрат и вывести значение в консоль.
while True:
    value = input()
    if value == 'END':
        print('Завершение работы...')
        break # Выход из цикла
    elif value.isdigit(): # Проверяет что каждый символ строки является цифрой
        print('Найдено целое число:', value, 'Квадрат числа: ', int(value) ** 2)
Обратите внимание, что в примере испольцуется очень рискованное условие while True, это значит что условие цикла всегда истинно и цикл является бесконечным. В примере есть две точки выхода:

  • Получение значения "END", инициирует прерывание цикла,
  • Отсутствие значения "END" поднимет исключение EOFError, когда input не сможет получить очередное значение
Эти условия не позволят циклу быть "вечным".

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

Пример с предусловием:
print('Задайте значение коэффициента а уравнения:')
a = float(input())
while a == 0:
    print('Коэффициент а не должен быть равен нулю!')
    print('Задайте значение коэффициента а уравнения:')
    a = float(input())
Пользователь программы вводит значение коэффициента "а", и в случае ввода ошибочного значения действия повторяются. Если введенное значение правильное, инструкция while больше выполняться не будет. Однако приведенный вариант оформления не очень хорош, потому что нам пришлось два раза написать две одни и те же инструкции. Можно поступить иначе, и написать постусловие:
while True:
    print('Задайте значение коэффициента а уравнения:')
    a = float(input())
    if a != 0:
        break
В данном случае использование постусловия очень полезно и запуск "бесконечного" цикла оправдан.