Циклы

Роботу приходится повторять действия: опрашивать датчик, обрабатывать несколько измерений, проходить точки маршрута или ждать безопасного расстояния. Копировать одну команду десятки раз неудобно. Цикл описывает повторение один раз и задаёт правило его продолжения.
Цикл for по очереди берёт элементы из последовательности или другого перебираемого объекта. Цикл while повторяет блок, пока его условие истинно. break завершает ближайший цикл, а continue сразу переходит к следующему повторению.
Зачем это нужно
Без циклов код для пяти измерений пришлось бы писать так:
print("Измерение", 1)
print("Измерение", 2)
print("Измерение", 3)
print("Измерение", 4)
print("Измерение", 5)
При изменении количества измерений пришлось бы добавлять или удалять строки вручную. Цикл отделяет повторяемое действие от набора значений или условия остановки. В робототехнической программе это помогает:
- последовательно обработать показания нескольких датчиков;
- выполнить заданное число шагов калибровки;
- проверять расстояние, пока путь занят;
- пройти список точек маршрута;
- пропустить повреждённое измерение;
- прекратить поиск после обнаружения нужного события.
Цикл не гарантирует своевременную реакцию реального устройства. Для моторов и защитных функций дополнительно учитывают частоту опроса, задержки, тайм-ауты и аппаратные ограничения. Но саму логику повторения удобно сначала проверить на моделируемых данных.
Главная идея
У любого полезного цикла есть три части:
- источник следующего элемента или условие продолжения;
- блок команд с отступом;
- способ закончить повторение.
В for окончание обычно наступает, когда элементы закончились. В while программа перед каждым повторением заново проверяет условие.
for sensor_name in ("left", "center", "right"):
print("Проверяем датчик:", sensor_name)
Переменная sensor_name по очереди получает три значения. Один проход блока называют итерацией.
Цикл for: действие для каждого элемента
Python-цикл for перебирает элементы объекта. Это может быть строка, список, кортеж, range и многие другие объекты, которые поддерживают перебор.
Перед первым примером достаточно знать простую вещь: список в Python записывают в квадратных скобках, а значения разделяют запятыми. Здесь список нужен только как удобный способ дать циклу несколько учебных значений; подробнее коллекции можно изучить отдельно.
distances_cm = [42, 35, 18, 51]
for distance_cm in distances_cm:
if distance_cm < 20:
print(distance_cm, "— близко")
else:
print(distance_cm, "— свободно")
На каждой итерации distance_cm содержит очередной элемент списка. Индекс для такого перебора не нужен.
| Часть записи | Назначение | В примере |
|---|---|---|
for | начинает цикл | for distance_cm ... |
| переменная цикла | получает очередной элемент | distance_cm |
in | связывает переменную с источником | in |
| перебираемый объект | поставляет элементы | distances_cm |
| двоеточие и отступ | задают повторяемый блок | строки с if |
Так называют объект, элементы которого можно получать по одному. Список и range — частые примеры, но цикл for не ограничен только ими.
Числовые последовательности с range
range() описывает неизменяемую арифметическую последовательность целых чисел. Часто она задаёт количество повторений.
for sample_number in range(5):
print("Номер измерения:", sample_number)
range(5) даёт числа 0, 1, 2, 3, 4. Конечная граница 5 не входит в последовательность.
| Запись | Получаемые значения | Назначение аргументов |
|---|---|---|
range(4) | 0, 1, 2, 3 | конец |
range(2, 6) | 2, 3, 4, 5 | начало, конец |
range(10, 3, -2) | 10, 8, 6, 4 | начало, конец, шаг |
Шаг не может быть равен нулю. Отрицательный шаг позволяет двигаться к меньшим значениям.
Для управления сервоприводом можно сначала сформировать учебную последовательность углов. Реальное устройство потребует библиотеки контроллера и проверки допустимого диапазона конкретного механизма.
angles_deg = []
for angle_deg in range(0, 91, 15):
angles_deg.append(angle_deg)
print(angles_deg)
Если нужен только элемент списка, перебирайте элементы. Если вместе со значением нужен его порядковый номер, используйте enumerate():
distances_cm = [32, 27, 19]
for sample_number, distance_cm in enumerate(distances_cm, start=1):
print(sample_number, distance_cm)
Такой код яснее ручного изменения отдельного счётчика.
Цикл while: повторение по условию
while подходит, когда число повторений заранее неизвестно. Перед каждой итерацией Python проверяет условие. Если оно ложно с самого начала, блок не выполнится ни разу.
distance_cm = 12
while distance_cm < 20:
print("Путь занят:", distance_cm)
distance_cm += 3
print("Можно продолжить проверку маршрута")
Переменная меняется внутри блока и через несколько итераций делает условие ложным. Если забыть обновление, цикл может стать бесконечным.
attempt = 0
max_attempts = 5
sensor_ready = False
while not sensor_ready and attempt < max_attempts:
attempt += 1
print("Попытка связи:", attempt)
sensor_ready = attempt == 3
print("Готовность:", sensor_ready)
Ограничение attempt < max_attempts не даёт учебной программе ждать бесконечно. В настоящем роботе вместо числа попыток часто нужен тайм-аут по времени и переход в безопасное состояние.

Когда выбирать for, а когда while
| Задача | Подходящий цикл | Почему |
|---|---|---|
| обработать все значения списка | for | набор элементов уже задан |
| выполнить 10 измерений | for с range(10) | количество повторений известно |
| идти по точкам маршрута | for | точки можно перебрать по очереди |
| ждать изменения состояния датчика | while | число проверок заранее неизвестно |
| повторять попытки до успеха или лимита | while | продолжение задаётся условием |
Правило выбора не связано только с формой записи. Сначала сформулируйте окончание: «после каждого элемента» обычно ведёт к for; «пока условие выполняется» — к while.
Досрочное завершение с break
break немедленно завершает ближайший цикл. Он полезен, если результат найден раньше конца последовательности.
distances_cm = [48, 36, 17, 12, 55]
first_dangerous = None
for distance_cm in distances_cm:
if distance_cm < 20:
first_dangerous = distance_cm
break
print("Первое опасное значение:", first_dangerous)
После значения 17 элементы 12 и 55 уже не проверяются. Код под циклом выполняется как обычно.
В Python у цикла может быть блок else. Он выполняется после нормального исчерпания элементов или после того, как условие while стало ложным, но пропускается при выходе через break.
distances_cm = [48, 36, 27]
for distance_cm in distances_cm:
if distance_cm < 20:
print("Найдено препятствие")
break
else:
print("Близких препятствий в серии нет")
Такой else относится к циклу, а не к внутреннему if. Используйте конструкцию только тогда, когда она делает поиск яснее для читателя.
Переход к следующей итерации с continue
continue пропускает оставшуюся часть текущей итерации и переходит к следующему элементу или к новой проверке условия.
raw_measurements = [24, None, -1, 31, 18]
valid_measurements = []
for distance_cm in raw_measurements:
if distance_cm is None or distance_cm < 0:
continue
valid_measurements.append(distance_cm)
print(valid_measurements)
Здесь None и отрицательное число считаются недопустимыми для выбранной учебной модели и не попадают в новый список. В реальном проекте критерий достоверности берут из документации датчика и протокола обмена.
Частое использование continue может скрыть основную логику среди исключений. Для коротких блоков иногда яснее записать положительное условие и выполнить обработку внутри if.
Вложенные циклы
Цикл можно поместить внутрь другого. Например, робот калибрует два канала и для каждого собирает три значения:
channels = ("left", "right")
calibration_table = []
for channel in channels:
for sample_number in range(3):
calibration_table.append((channel, sample_number))
print(calibration_table)
Внутренний цикл полностью выполняется для каждого элемента внешнего. Здесь получится 2 × 3 = 6 пар. При больших диапазонах количество операций быстро растёт, поэтому границы вложенных циклов стоит оценивать заранее.
break завершает только ближайший цикл. Если он находится во внутреннем блоке, внешний цикл продолжит работу со следующим элементом.
Робототехнический пример: обработка серии измерений
Пусть программа получает заранее сохранённую серию расстояний. Она пропускает отсутствие данных, останавливает поиск при опасном значении и считает число нормальных измерений:
measurements_cm = [52, None, 41, 33, 16, 29]
checked_count = 0
stop_distance_cm = 20
for distance_cm in measurements_cm:
if distance_cm is None:
print("Измерение пропущено")
continue
checked_count += 1
if distance_cm < stop_distance_cm:
print("Стоп:", distance_cm)
break
print("Путь свободен:", distance_cm)
print("Проверено корректных значений:", checked_count)
В этой модели for задаёт источник данных, continue отбрасывает отсутствующее измерение, а break прекращает обработку после обнаружения угрозы. Для настоящей системы нужно решить, допустимо ли вообще продолжать движение при None: безопасная политика может требовать немедленной остановки.
Что запомнить про циклы
forберёт элементы по одному, аwhileповторяет блок по условию.range(stop)начинается с нуля и не включаетstop.- Переменные, влияющие на
while, должны обновляться так, чтобы цикл мог завершиться. breakзавершает ближайший цикл,continueпропускает остаток текущей итерации.- Блок
elseу цикла выполняется только при завершении безbreak. - Для ожидания датчика нужен предел: число попыток, тайм-аут или другое безопасное условие выхода.
Практика
Задание 1. Серия измерений
Создайте список из семи расстояний и с помощью for выведите для каждого одно из состояний: «близко» или «свободно». Порог выберите самостоятельно. Добавьте проверку значений ровно на границе.
Задание 2. Калибровочные шаги
С помощью range() сформируйте последовательность из шести равномерных положений сервопривода. Начальное и конечное положения должны задаваться переменными. Готовые углы в условии задания не приведены — рассчитайте параметры range() сами.
Задание 3. Ограниченное ожидание
Напишите while, который моделирует попытки получить данные от датчика. Цикл должен завершаться либо после появления данных, либо после заданного максимума попыток. Выведите причину завершения.
Задание 4. Фильтрация
В списке смешаны числа, None и отрицательные значения. Соберите новый список только из допустимых измерений с помощью continue. Затем измените правило так, чтобы первое опасное положительное значение завершало цикл через break.
Задание 5. Таблица маршрута
Создайте список из трёх точек маршрута, а для каждой точки выполните четыре условных шага измерения во вложенном цикле. Подсчитайте общее число итераций и проверьте расчёт выводом программы.
Проверьте себя
- Что получает переменная после слова
forна каждой итерации? - Почему
range(5)не содержит число5? - Может ли блок
whileне выполниться ни разу? - В чём опасность условия
while, которое никогда не становится ложным? - Чем
breakотличается отcontinue? - Когда выполняется
else, связанный с циклом? - Какой цикл удобнее для обработки готового списка измерений?
- Почему ожидание ответа датчика следует ограничивать?
Сначала ответьте без подсказки. Ответ можно считать полным, если вы:
- формулируете основную мысль своими словами;
- называете важные условия, ограничения или меры безопасности;
- для схемы, кода или расчёта показываете ход решения и ожидаемый результат.
Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.
Словарь статьи
- Цикл — конструкция для повторного выполнения блока команд.
- Итерация — один проход тела цикла.
- Тело цикла — блок с отступом, который выполняется повторно.
- Перебираемый объект — объект, выдающий элементы по одному для
for. range— тип неизменяемых арифметических последовательностей целых чисел.while— цикл, продолжающийся, пока условие истинно.break— команда немедленного выхода из ближайшего цикла.continue— команда перехода к следующей итерации.- Вложенный цикл — цикл, расположенный внутри другого цикла.
- Бесконечный цикл — цикл, условие завершения которого не наступает без внешнего воздействия.
Связанные темы
- Условия — как выбирать действия внутри цикла.
- Функции — как вынести повторяемую обработку в отдельную функцию.
- Работа с файлами — как читать серии значений и записывать результаты.