</>
Тема 6 из 18

Цикл while

selfedu · Видео необязательно — всё нужное есть в тексте ниже.Открыть на YouTube ↗

Цикл for хорош, когда заранее известно, сколько раз повторять. Но бывает иначе: «делить число на 10, пока в нём есть цифры», «читать числа, пока не встретится ноль». Для таких случаев есть цикл while.

Как работает while

n = 1
while n <= 100:
    n = n * 2
print(n)     # 128
  1. Проверяется условие n <= 100.
  2. Если оно истинно — выполняется тело цикла, и всё повторяется с шага 1.
  3. Если ложно — цикл заканчивается, программа идёт дальше.

Здесь n проходит значения 1, 2, 4, …, 64, 128 — на 128 условие становится ложным.

Бесконечный цикл — главная опасность

Если в теле цикла ничего не меняет условие, цикл не закончится никогда:

k = 5
while k > 0:
    print(k)      # k не меняется — программа зависнет

Проверяя такой код, система выдаст TLE — «превышено время». Всегда спрашивай себя: что внутри цикла приближает его к концу?

Число по цифрам

Вспомни: n % 10 — последняя цифра, n // 10 — число без неё. В цикле можно «откусывать» цифры по одной, пока число не станет нулём. Например, посчитаем, сколько цифр в числе:

n = int(input())     # например, 40517
digits = 0
while n > 0:
    n //= 10
    digits += 1
print(digits)        # 5

Подумай, что выведет этот код для n = 0 и как это исправить, если в задаче такое возможно.

А так можно найти последнюю цифру, которая больше 5, или проверить, есть ли в числе семёрка — тот же цикл, другая работа внутри.

Чтение до конца данных

Иногда количество чисел не дано, а конец данных отмечен особым значением, например нулём:

x = int(input())
total = 0
while x != 0:
    total += x
    x = int(input())    # читаем следующее в конце тела
print(total)

Обрати внимание на схему: первое число читается до цикла, следующее — в конце тела. Так ноль-маркер никогда не попадает в обработку.

break — выйти из цикла

break немедленно завершает цикл (и while, и for):

n = int(input())
d = 2
while d <= n:
    if n % d == 0:
        break          # нашли делитель — дальше искать незачем
    d += 1
print(d)               # наименьший делитель больше 1

continue — к следующей итерации

continue пропускает остаток тела и сразу переходит к следующему шагу:

for i in range(1, 11):
    if i % 3 == 0:
        continue
    print(i, end=" ")   # 1 2 4 5 7 8 10

while True

Иногда удобно написать «бесконечный» цикл и выйти из него через break, когда пора:

while True:
    word = input()
    if word == "стоп":
        break
    print("Ты ввёл:", word)

Что выбрать: for или while

  • известно число повторов или нужно перебрать range — for;
  • повторять, «пока» что-то не случится, — while.

Любой for можно переписать через while, но for короче и в нём не забудешь изменить счётчик.

Итог

  • while условие: повторяет тело, пока условие истинно;
  • внутри цикла что-то должно менять условие, иначе — бесконечный цикл и TLE;
  • % 10 и // 10 в цикле разбирают число по цифрам;
  • маркер конца данных: первое значение читаем до цикла, следующее — в конце тела;
  • break выходит из цикла, continue переходит к следующей итерации.