Циклы for, while и do-while: чем отличаются и как выбрать

Циклы for, while и do-while: чем отличаются и как выбрать Полезное

Цикл в программировании — это управляющая конструкция, которая повторяет один и тот же блок инструкций, пока выполняется заданное условие. В этой статье разбираем три основных вида: for со счетчиком, while с проверкой перед телом и do-while с проверкой после тела. Отдельно — бесконечный цикл, критерий выхода из него и операторы break/continue.

Виды циклов: for, while, do-while

Три вида различаются тем, в какой момент проверяется условие и сколько раз тело выполнится гарантированно.

Тип Когда проверяется условие Минимум проходов Где встречается
for (счетчик) до каждой итерации, диапазон известен заранее 0 Python, C, C++, Java, Pascal
while (предусловие) до тела, на каждом шаге 0 Python, C, C++, Java, Pascal
do-while (постусловие) после тела 1 C, C++, Java
repeat-until (постусловие, инверсия) после тела, выход когда условие стало истинным 1 Pascal

Условие у for и while проверяется ДО выполнения тела: если оно сразу ложно, тело не выполнится ни разу. У do-while и repeat-until проверка идет ПОСЛЕ тела, поэтому оно гарантированно отработает минимум один раз — в этом их принципиальное различие, а не только синтаксис.

For: когда число повторений известно заранее

For применяют, если заранее известен диапазон значений или количество проходов — перебор списка, счет от 1 до N. В Python счетчик задается через range:

for i in range(1, 6):
    print(i)

Вывод:

1
2
3
4
5

range(1, 6) дает числа от 1 до 5 включительно — верхняя граница не входит в диапазон. Это частая ошибка новичков: range(1, 5) даст только 1-4, а не 1-5. У range есть и третий параметр — шаг (range(0, 10, 2) даст четные числа от 0 до 8).

While: когда решение принимается по ходу дела

While используют, если число повторений заранее не известно и зависит от условия, которое меняется внутри цикла. Проследим цикл суммирования чисел от 1 до 5 по шагам:

  • старт: total = 0, i = 1
  • шаг 1: i <= 5 истина, total = 0 + 1 = 1, i = 2
  • шаг 2: i <= 5 истина, total = 1 + 2 = 3, i = 3
  • шаг 3: i <= 5 истина, total = 3 + 3 = 6, i = 4
  • шаг 4: i <= 5 истина, total = 6 + 4 = 10, i = 5
  • шаг 5: i <= 5 истина, total = 10 + 5 = 15, i = 6
  • проверка: i <= 5 ложь, цикл завершен

Тот же расчет в коде:

total = 0
i = 1
while i <= 5:
    total += i
    i += 1
print(total)

Вывод:

15

Ключевое условие: переменная, от которой зависит выход из цикла (здесь i), обязана меняться внутри тела. Если убрать строку i += 1, условие i <= 5 останется истинным навсегда и цикл не завершится — это и есть бесконечный цикл по ошибке, без единой строки вывода после запуска.

Do-while: постусловие, которого нет в Python

В C, C++ и Java есть отдельная конструкция do-while: тело выполняется первым, а условие проверяется после каждого прохода.

int i = 0;
do {
    std::cout << i << std::endl;
    i++;
} while (i < 3);

Вывод:

0
1
2

Трассировка: i=0, печать 0, i=1, проверка i<3 истина; i=1, печать 1, i=2, проверка истина; i=2, печать 2, i=3, проверка i<3 ложь — стоп.

В Python отдельного оператора do-while нет. Это не пробел в языке, а его архитектурное решение: постусловный цикл эмулируют через while True с проверкой и break внутри тела:

i = 0
while True:
    print(i)
    i += 1
    if i >= 3:
        break

Вывод тот же:

0
1
2

Отдельно стоит Pascal с оператором repeat-until — тоже постусловие, но с обратной логикой: do-while в C выполняется, ПОКА условие истинно, а repeat в Pascal выполняется, ПОКА условие ложно, и останавливается, когда оно станет истинным. Синтаксически похожие конструкции по факту проверяют противоположные условия — при переносе кода между языками это частая причина ошибки на единицу.

Бесконечный цикл и критерий выхода

Бесконечный цикл — конструкция, у которой условие продолжения никогда не станет ложным (while True, for(;;) в C). Сам по себе он не ошибка: событийные циклы серверов, GUI-приложений и обработчиков очередей сознательно пишут бесконечными, а выход из них делают через break, return или сигнал извне.

Проблема начинается, когда бесконечный цикл получается НЕ специально: условие зависит от переменной, которая не меняется в теле, или меняется так, что нужное значение никогда не будет достигнуто. Прежде чем писать цикл с условием, стоит проверить: какая переменная отвечает за выход и в какой строке она гарантированно меняется на каждом проходе.

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

break и continue: управление изнутри цикла

break полностью останавливает цикл и передает выполнение на код после него. continue прерывает только текущую итерацию и переходит к проверке условия следующей.

numbers = [3, 7, 8, 12, 5]
for n in numbers:
    if n % 2 != 0:
        continue
    print(n)
    break

Вывод:

8

Трассировка: n=3 — нечетное, continue, пропуск печати; n=7 — нечетное, continue; n=8 — четное, печать 8, затем break — цикл останавливается, 12 и 5 уже не проверяются. Так ищут первый элемент по условию, не перебирая весь список без необходимости.

Выводы

  • For выбирают, когда число повторений известно заранее (диапазон, длина списка); while — когда решение о продолжении зависит от условия, которое меняется по ходу работы.
  • Do-while (C, C++, Java) и repeat-until (Pascal) — постусловные циклы: тело гарантированно выполняется минимум один раз, проверка идет после него; логика условия у них противоположная.
  • В Python отдельного do-while нет — постусловный цикл эмулируют через while True с break внутри тела.
  • Бесконечный цикл — не ошибка сама по себе, а инструмент (событийные циклы, серверы); ошибкой он становится, если переменная выхода не меняется в теле или условие выхода недостижимо.
  • break прерывает цикл целиком, continue — только текущую итерацию.

Где применяется / связь с практикой

Циклы — один из первых инструментов, без которых не обходится ни одна программа: перебор данных, обработка файлов, ожидание ответа от сервера, отрисовка кадров. Разница между for, while и постусловными циклами, а также аккуратная работа с break и continue — база, на которой строится весь дальнейший код на Python.

Освойте тему на практике

Разобрать циклы на практике, с разбором ошибок и обратной связью от преподавателя, можно на курсе Python Basic — формат для тех, кто начинает программировать с нуля. Проверить формат перед стартом курса можно на открытых уроках Otus.

FAQ

Чем repeat-until в Pascal отличается от do-while в C по логике условия?
Do-while продолжает выполняться, пока условие истинно. Repeat-until останавливается, когда условие становится истинным, то есть выполняется, пока оно ложно — логика обратная при внешне похожем синтаксисе.

Можно ли специально писать бесконечный цикл, и это не ошибка?
Да, это нормальный прием для событийных циклов серверов, GUI и обработчиков очередей — выход из них делают через break, return или внешний сигнал, а не через условие самого цикла.

Что будет, если изменить счетчик for внутри тела цикла?
В Python изменение переменной цикла внутри тела не влияет на последовательность range — она уже вычислена заранее. В языках с классическим for (C, C++) изменение счетчика в теле повлияет на следующую итерацию, так как условие и шаг пересчитываются каждый раз заново.

OTUS Журнал
Бесплатные открытые уроки (поп-ап)