Перейти к содержимому
Теория · Циклы · урок 1 из 7

Цикл while

Чему вы научитесь

Чему вы научитесь:

  • повторять код циклом while, пока условие истинно;
  • предсказывать, сколько раз выполнится тело цикла и чему равен счётчик после него;
  • перебирать числа через for и range, а через for по строке — её символы;
  • выходить из цикла через break, пропускать круг через continue и понимать ветку else у цикла.
Беговая дорожка: старт n = 1, контрольная арка n <= 100 перед кругом и счётчик кругов n += 1

Чтобы сложить числа от 1 до 100, пришлось бы написать сто слагаемых подряд. Никто так не делает. Для повторяющихся действий есть цикл — конструкция, которая выполняет блок кода снова и снова.

Представьте беговую дорожку. На старте стоит табличка n = 1: бегун начинает с первого круга. Перед каждым кругом он проходит контрольную арку n <= 100. Если арка пропускает, бегун пробегает круг и отмечает его на счётчике кругов: n += 1.

Когда арка не пропускает, бег окончен, и бегун уходит с дорожки. Цикл while работает так же: он повторяет свой блок, пока его условие истинно. Вот сумма от 1 до 100:

Python
total = 0
n = 1
while n <= 100:
    total += n
    n += 1
print(total)  # 5050

Давайте разберём программу по строкам:

  1. total = 0 готовит сумму.
  2. n = 1 — табличка на старте: счёт начинается с единицы.
  3. while n <= 100: — контрольная арка перед каждым кругом.
  4. total += n прибавляет номер круга к сумме.
  5. n += 1 отмечает круг на счётчике.
  6. print(total) выполняется после цикла и печатает 5050.

Условие и счётчик

Строка while n <= 100: устроена как if: после условия стоит двоеточие, а тело цикла — блок с отступом под ней. Один проход тела называют итерацией.

Самое важное в while — порядок действий. Python проверяет условие перед каждой итерацией, а не после неё. Цикл заканчивается в тот момент, когда последнее изменение в теле сделало условие ложным. Поэтому после цикла в n лежит не 100, а 101: на значении 101 арка и закрылась.

Нажмите «Следующий шаг» и следите за n в строке while: цикл заканчивается при n, равной 4, хотя последний круг был третьим.

ВживуюКогда заканчивается whileшаг 1 из 13 · рамок: 1

total = 0 готовит сумму.

Условие проверяется перед каждым кругом

Такие вопросы любят на собеседованиях: сколько раз выполнится тело и чему равен счётчик после цикла. Ответ всегда даёт одно правило: условие проверяется перед кругом.

Здесь аналогия с бегуном неточна. Бегун пробегает хотя бы один круг, а while проверяет условие ещё до первой итерации. Если условие ложно с самого начала, тело не выполнится ни разу: с n = 200 программа сразу напечатает 0.

Шаг не обязательно единица

Счётчик может меняться как угодно. Запись n //= 2 значит то же, что n = n // 2: число делится нацело, и результат записывается обратно. Так считают, сколько раз 100 нужно разделить нацело на 2, чтобы осталась 1:

Python
n = 100
steps = 0
while n > 1:
    n //= 2
    steps += 1
print(steps)  # 6

По итерациям n принимает значения 50, 25, 12, 6, 3 и 1. При n, равной 1, условие n > 1 ложно, и цикл заканчивается после шести итераций.

Бесконечный цикл

Условие цикла while True: истинно всегда, поэтому сам такой цикл не заканчивается. Этот бесконечный цикл удобен внутри функции, когда заранее неизвестно, сколько понадобится итераций. Его прерывает return: он завершает функцию, а вместе с ней и цикл. Эта функция ищет первое число, квадрат которого больше limit:

Python
def first_square_over(limit):
    n = 1
    while True:
        if n * n > limit:
            return n
        n += 1


print(first_square_over(50))  # 8

Разберём, что происходит при вызове first_square_over(50):

  1. Поиск начинается с n = 1.
  2. Для n от 1 до 7 квадрат не больше 50, и цикл идёт дальше.
  3. При n, равной 8, квадрат равен 64, и return возвращает 8.

Частая ошибка

В теле цикла забыли изменить счётчик:

Python
i = 1
while i <= 3:  # ✗
    print(i)

Переменная i всегда равна 1, условие всегда истинно, и программа печатает 1 без конца. Бегун крутится на дорожке, а счётчик кругов стоит на месте. На своём компьютере такую программу останавливает сочетание клавиш Ctrl+C, и трассировка заканчивается строкой:

TEXT
KeyboardInterrupt

В задачах курса бесконечный цикл останавливает ограничение по времени, и результатов проверок не будет. Добавьте i += 1 в конец тела, и цикл напечатает 1, 2 и 3.

Главное

  • while повторяет тело, пока условие истинно, и проверяет его перед каждой итерацией.
  • Цикл заканчивается, когда изменение в теле сделало условие ложным: после while n <= 100 в n лежит 101.
  • Если условие ложно с самого начала, тело не выполнится ни разу.
  • Без изменения счётчика в теле цикл становится бесконечным.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом