Цикл в программировании — это управляющая конструкция, которая повторяет один и тот же блок инструкций, пока выполняется заданное условие. В этой статье разбираем три основных вида: 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++) изменение счетчика в теле повлияет на следующую итерацию, так как условие и шаг пересчитываются каждый раз заново.



