
Циклы for и while в Python
Разбираем повторение действий без копирования кода: перебор коллекций, range, условный цикл, break, continue и защита от бесконечного выполнения.
Содержание
Цикл повторяет один блок кода для разных данных или до наступления условия. Без него обработка десяти серверов превратилась бы в десять одинаковых строк, а добавление одиннадцатого потребовало бы менять программу.
В примерах используются списки из предыдущего урока и условия. Все действия ограничены выводом в терминал.
for перебирает элементы напрямую
Создайте файл loops.py. Первый цикл берёт по одному имени из списка и печатает его:
servers = ["web-01", "db-01", "backup-01"]
for server in servers:
print(f"Проверяем {server}")
Программа выведет три строки в порядке списка. На каждом проходе, или итерации, имя server связано с очередным элементом. Четыре пробела показывают тело цикла; после возврата отступа повторение заканчивается.
Не изменяйте длину того же списка во время прямого перебора: удаление сдвигает позиции и часть элементов может быть пропущена. Если нужно отфильтровать данные, создайте новый список или перебирайте копию осознанно.
enumerate добавляет номер без ручного счётчика
Когда нужен и элемент, и его позиция, используйте enumerate. Следующий код начинает пользовательскую нумерацию с единицы:
for position, server in enumerate(servers, start=1):
print(f"{position}. {server}")
Ожидаются строки 1. web-01, 2. db-01 и 3. backup-01. enumerate выдаёт пары из номера и значения, а распаковка связывает их с двумя именами. Исходный список не меняется.
Индекс в программе по-прежнему начинается с нуля; параметр start=1 влияет только на числа, которые создаёт enumerate. Не прибавляйте единицу ещё раз.
range создаёт числовую последовательность
range полезен, когда действие нужно повторить заданное число раз или получить диапазон целых значений. Код ниже выполняет три попытки с номерами 1, 2 и 3:
for attempt in range(1, 4):
print(f"Попытка {attempt}")
Конечное число 4 не включается. Если передать одно значение, например range(3), последовательность будет 0, 1, 2. Объект range вычисляет элементы по мере перебора и не создаёт огромный список заранее.
Не используйте range(len(servers)), если индекс не нужен. Прямая запись for server in servers короче и не связывает логику с устройством списка.
continue пропускает один проход
Условие внутри цикла может исключить неподходящий элемент. Допустим, отключённые серверы отмечены пустой строкой:
servers = ["web-01", "", "db-01"]
for server in servers:
if not server:
continue
print(f"Активная запись: {server}")
Вывод содержит только web-01 и db-01. continue прекращает текущий проход до print, затем цикл берёт следующий элемент. Такая запись удобна для простого фильтра, но большое число continue может скрыть сложную логику.
break завершает поиск
Когда нужный элемент найден, продолжать перебор необязательно. Следующий пример ищет первое имя, начинающееся с db-:
servers = ["web-01", "db-01", "db-02"]
found = None
for server in servers:
if server.startswith("db-"):
found = server
break
print(found)
Программа выведет db-01 и не проверит db-02. Метод startswith возвращает логический ответ о начале строки. Если совпадений нет, found останется None, что вызывающий код должен отличать от реального имени.
break действует на ближайший цикл. Во вложенных циклах он не завершает все уровни, поэтому сложный поиск лучше вынести в функцию и вернуть результат.
while повторяет код по условию
while нужен, когда число проходов заранее неизвестно. Например, программа просит положительное число, пока пользователь не введёт подходящее значение:
quantity = 0
while quantity <= 0:
text = input("Введите положительное количество: ")
quantity = int(text)
print(f"Принято: {quantity}")
После положительного числа условие quantity <= 0 становится ложным и цикл заканчивается. Если ввести текст, int вызовет ValueError; обработка такой ошибки появится через два урока. Прервать зациклившийся запуск в терминале обычно можно Ctrl+C.
Главный риск while — условие, которое никогда не меняется. Перед запуском ответьте, какая строка приблизит завершение и что произойдёт при постоянной внешней ошибке. Сетевой повтор должен иметь ограничение попыток и паузу, иначе скрипт создаст лишнюю нагрузку.
Вложенные циклы умножают объём работы
Цикл внутри цикла выполняет внутренний блок для каждого внешнего элемента. Для трёх серверов и четырёх портов получится двенадцать сочетаний. На малых наборах это нормально, но два больших списка могут дать миллионы операций.
Не оптимизируйте наугад: сначала оцените размеры и измерьте время. Часто словарь или множество позволяют заменить повторный полный поиск быстрым обращением по ключу.
Следующий урок — функции и возвращаемые значения: они дадут имя повторяемому действию и отделят вычисление от обхода данных. Синтаксис циклов описан в официальном разделе Control Flow.
Самопроверка
Проверьте, что материал усвоен
Ответьте на все вопросы. Результат сохранится только в этом браузере и будет учтён в статистике прочитанных материалов.
Разбираем коротко
Частые вопросы
Когда использовать for, а когда while?
for подходит для последовательного перебора известной коллекции или диапазона. while повторяет действия, пока истинно условие, поэтому нужен явный путь к его изменению и завершению.
Меняет ли range список?
Нет. range создаёт объект, который выдаёт последовательность целых чисел по мере перебора. Он не добавляет индексы в исходную коллекцию.
Чем break отличается от continue?
break немедленно завершает ближайший цикл, а continue пропускает остаток текущего прохода и начинает следующий.


