Menu
Русский

Циклы for в Python: итерация по спискам, строкам, range и словарям

Как работает цикл for в Python — итерация по спискам, строкам, range, словарям и всему, что итерируемо, плюс break, continue и else.

Цикл for в Python — это «для каждого»

Если ты приходил из C-подобного языка, цикл for в Python будет выглядеть непривычно. Здесь нет счётчика вида for (i = 0; i < n; i++). for в Python — строго для каждого: ты даёшь ему коллекцию, он выдаёт элементы по одному.

main.py
Output
Click Run to see the output here.

Выведет три строки. Python читает список, вытаскивает каждый элемент по очереди и связывает его с color, пока выполняется тело. Когда больше ничего не осталось — цикл заканчивается.

Обрати внимание на форму — for <name> in <iterable>: и тело с отступом. Отступ, двоеточие, тело — та же структура, что у if.

Что считается итерируемым

Практически всё, что хранит последовательность значений. Списки, кортежи, строки, range, словари, множества, файлы и большинство собственных объектов, которые ты будешь создавать.

main.py
Output
Click Run to see the output here.

Единообразие — вот что приятно: один синтаксис, много форм данных.

Счётчик через range()

Когда счётчик всё-таки нужен — «сделай это десять раз» или «пройди индексы от 0 до 9» — используй range():

main.py
Output
Click Run to see the output here.

Выведет 0, 1, 2, 3, 4. range(stop) считает с 0 до, но не включая stop. range(start, stop) позволяет задать начало, а range(start, stop, step) — шаг:

main.py
Output
Click Run to see the output here.

range достоин отдельной страницы, она впереди, — потому что его полезно понимать чуть глубже. Пока запомни: range(n) даёт n итераций, пронумерованных от 0 до n-1.

enumerate: цикл с индексом

Частая потребность: «хочу и индекс, и значение». Инстинкт новичка — range(len(...)), но у Python есть инструмент аккуратнее:

main.py
Output
Click Run to see the output here.

enumerate() выдаёт пары (index, value). Две переменные после for распаковывают пару в два имени — index и color. Гораздо чище, чем:

main.py
Output
Click Run to see the output here.

Если хочешь считать с 1, а не с 0 — передай start=1:

main.py
Output
Click Run to see the output here.

zip: итерация по двум последовательностям одновременно

Когда у тебя два списка одинаковой длины и ты хочешь их спарить:

main.py
Output
Click Run to see the output here.

zip останавливается на самой короткой последовательности. Если хочешь, чтобы он продолжал и заполнял None, используй itertools.zip_longest.

Итерация по словарю

Словари дают выбор, по чему именно итерировать:

main.py
Output
Click Run to see the output here.

В большинстве случаев нужен .items() — получаешь ключ и значение вместе в одной читаемой строке.

break и continue

Иногда хочется выскочить пораньше или пропустить одну итерацию.

break немедленно выходит из цикла:

main.py
Output
Click Run to see the output here.

Как только число больше 6 найдено, цикл останавливается. Оставшиеся элементы игнорируются.

continue пропускает остаток текущей итерации и переходит к следующей:

main.py
Output
Click Run to see the output here.

Оба приемлемы, но continue может усложнить чтение цикла, если их больше одного. Часто обычный if/else читается лучше.

Ветка else у цикла

У Python есть фишка, которой нет у большинства языков: ветка else у цикла. Она срабатывает, если цикл завершился без break:

main.py
Output
Click Run to see the output here.

Полезно, но сначала запутывает. Не считай себя обязанным использовать — булев флаг вне цикла часто понятнее новому читателю.

Модификация списка во время итерации

Одна ловушка, которую стоит пометить: не добавляй и не удаляй элементы из списка, пока по нему итерируешь. Итерация запутывается в валидных индексах, и ты либо пропустишь элементы, либо получишь ошибку. Безопасный паттерн — строить новый список:

main.py
Output
Click Run to see the output here.

Или, когда освоишься, списковое включение сделает то же самое в одну строку — это в главе про коллекции.

Маленький пример от начала до конца

Связываем пару приёмов — читаем список, фильтруем, enumerate, печатаем:

main.py
Output
Click Run to see the output here.

Дальше: циклы 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 в конце цикла.

Учитесь программировать с Coddy

НАЧАТЬ