Цикл while
Цикл for хорош, когда заранее известно, сколько раз повторять. Но бывает иначе: «делить число на 10, пока в нём есть цифры», «читать числа, пока не встретится ноль». Для таких случаев есть цикл while.
Как работает while
n = 1
while n <= 100:
n = n * 2
print(n) # 128
- Проверяется условие
n <= 100. - Если оно истинно — выполняется тело цикла, и всё повторяется с шага 1.
- Если ложно — цикл заканчивается, программа идёт дальше.
Здесь 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переходит к следующей итерации.