Цикл for в Python — это «для каждого»
Если ты приходил из C-подобного языка, цикл for в Python будет выглядеть непривычно. Здесь нет счётчика вида for (i = 0; i < n; i++). for в Python — строго для каждого: ты даёшь ему коллекцию, он выдаёт элементы по одному.
Выведет три строки. Python читает список, вытаскивает каждый элемент по очереди и связывает его с color, пока выполняется тело. Когда больше ничего не осталось — цикл заканчивается.
Обрати внимание на форму — for <name> in <iterable>: и тело с отступом. Отступ, двоеточие, тело — та же структура, что у if.
Что считается итерируемым
Практически всё, что хранит последовательность значений. Списки, кортежи, строки, range, словари, множества, файлы и большинство собственных объектов, которые ты будешь создавать.
Единообразие — вот что приятно: один синтаксис, много форм данных.
Счётчик через range()
Когда счётчик всё-таки нужен — «сделай это десять раз» или «пройди индексы от 0 до 9» — используй range():
Выведет 0, 1, 2, 3, 4. range(stop) считает с 0 до, но не включая stop. range(start, stop) позволяет задать начало, а range(start, stop, step) — шаг:
range достоин отдельной страницы, она впереди, — потому что его полезно понимать чуть глубже. Пока запомни: range(n) даёт n итераций, пронумерованных от 0 до n-1.
enumerate: цикл с индексом
Частая потребность: «хочу и индекс, и значение». Инстинкт новичка — range(len(...)), но у Python есть инструмент аккуратнее:
enumerate() выдаёт пары (index, value). Две переменные после for распаковывают пару в два имени — index и color. Гораздо чище, чем:
Если хочешь считать с 1, а не с 0 — передай start=1:
zip: итерация по двум последовательностям одновременно
Когда у тебя два списка одинаковой длины и ты хочешь их спарить:
zip останавливается на самой короткой последовательности. Если хочешь, чтобы он продолжал и заполнял None, используй itertools.zip_longest.
Итерация по словарю
Словари дают выбор, по чему именно итерировать:
В большинстве случаев нужен .items() — получаешь ключ и значение вместе в одной читаемой строке.
break и continue
Иногда хочется выскочить пораньше или пропустить одну итерацию.
break немедленно выходит из цикла:
Как только число больше 6 найдено, цикл останавливается. Оставшиеся элементы игнорируются.
continue пропускает остаток текущей итерации и переходит к следующей:
Оба приемлемы, но continue может усложнить чтение цикла, если их больше одного. Часто обычный if/else читается лучше.
Ветка else у цикла
У Python есть фишка, которой нет у большинства языков: ветка else у цикла. Она срабатывает, если цикл завершился без break:
Полезно, но сначала запутывает. Не считай себя обязанным использовать — булев флаг вне цикла часто понятнее новому читателю.
Модификация списка во время итерации
Одна ловушка, которую стоит пометить: не добавляй и не удаляй элементы из списка, пока по нему итерируешь. Итерация запутывается в валидных индексах, и ты либо пропустишь элементы, либо получишь ошибку. Безопасный паттерн — строить новый список:
Или, когда освоишься, списковое включение сделает то же самое в одну строку — это в главе про коллекции.
Маленький пример от начала до конца
Связываем пару приёмов — читаем список, фильтруем, enumerate, печатаем:
Дальше: циклы while
for — правильный выбор, когда ты знаешь, по чему итерируешь. while — правильный выбор, когда идёшь по кругу до смены условия. Об этом дальше.
Часто задаваемые вопросы
Как работает цикл for в Python?
for item in sequence: выполняет тело с отступом по одному разу на каждый элемент последовательности, при этом item поочерёдно принимает каждое значение. Последовательностями являются списки, кортежи, строки, словари, range и любой объект с итератором.
В чём разница между break и continue?
break немедленно выходит из цикла, пропуская оставшиеся итерации. continue пропускает остаток текущей итерации и переходит к следующей. break — это «я закончил»; continue — «этот пропусти».
Как сделать цикл с индексом в Python?
Оберни последовательность в enumerate(...), чтобы получить пары (index, value): for i, item in enumerate(items):. Гораздо чище, чем держать свой счётчик с i += 1 в конце цикла.