Циклы и списки в Python: как перебирать элементы
Почему нужны циклы
Если вы храните несколько значений в списке, часто возникает задача применить одну и ту же операцию к каждому элементу: вывести значение, посчитать среднее, преобразовать формат или отфильтровать элементы по условию. Ручное обращение к каждому элементу неудобно и небезопасно — код становится громоздким и трудночитаемым.
Циклы решают эти задачи: вы пишете логику один раз, а Python выполняет её для каждого элемента автоматически. Это экономит время, снижает шанс ошибок и упрощает поддержку кода.
Важно: термин «список» (list) — упорядоченная коллекция объектов в квадратных скобках. Цикл for — конструкция языка для итерации по коллекции.
Пример: список победителей «Пловец года» (2016–2019)
Допустим, у нас есть список американских пловцов, получивших награду «Пловец года» в 2016–2019. Без цикла пришлось бы обращаться к элементам по одному — громоздко и неэффективно. С помощью for задача решается просто:
swimmers = ['phelps', 'dressel', 'kalisz', 'dressel']
for swimmer in swimmers:
print(swimmer)Объяснение по шагам:
- Создаём список swimmers и записываем в него имена победителей.
- Запускаем цикл for: Python берёт первый элемент списка и присваивает его переменной swimmer.
- Выполняем тело цикла — в примере это print(swimmer).
- После завершения тела цикла Python возвращается к строке for и берёт следующий элемент.
Так цикл выполняет одну и ту же операцию для каждого элемента автоматически.
Краткий обзор того, как работает цикл
Цикл for в Python итеративно присваивает переменной значение следующего элемента из итерируемого объекта (списка, кортежа, строки, генератора и т. п.). Название временной переменной может быть любым, но выбирайте понятные имена — это улучшает читаемость.
Примеры хороших имён переменных:
for product in products:
...
for bird in birds:
...
for actor in actors:
...Если в теле цикла вы используете несколько операторов, они все выполняются для каждого элемента списка — пока вы правильно оформите отступы.
Несколько операторов в теле цикла
Вы можете выполнять сколько угодно операций внутри цикла. Главное — сохранить отступы, чтобы Python понимал, какие строки входят в тело цикла. Пример с комплиментами для каждого пловца:
swimmers = ['phelps', 'dressel', 'kalisz', 'dressel']
for swimmer in swimmers:
print(f"{swimmer.title()}, your swimming skills are terrific!")
print(f"Looking forward to see you in the next competition, {swimmer.title()}.")
print() # пустая строка между записямиВажное замечание: строки, стоящие на том же уровне отступа, что и for, не входят в тело цикла и выполняются один раз после завершения итераций.
Альтернативные подходы и расширенные приёмы
Иногда for — не единственный и не всегда оптимальный вариант. Ниже — практичные альтернативы и приёмы, которые пригодятся при реальной разработке.
- Списковые включения (list comprehensions) — компактный способ создать новый список на основе существующего:
upper_swimmers = [s.title() for s in swimmers]- Генераторы — экономят память при обработке больших последовательностей:
gen = (s.title() for s in swimmers)
for s in gen:
print(s)- enumerate — когда нужен индекс и значение одновременно:
for idx, swimmer in enumerate(swimmers, start=1):
print(idx, swimmer)- range + индексация — если нужно работать с индексами или менять элементы списка по позиции:
for i in range(len(swimmers)):
swimmers[i] = swimmers[i].title()- zip — итерация параллельно по нескольким спискам:
years = [2016, 2017, 2018, 2019]
for year, swimmer in zip(years, swimmers):
print(year, swimmer)- map и filter — функциональные аналоги, полезны для простых преобразований и фильтрации (часто читается хуже, чем list comprehension):
names = list(map(str.title, swimmers))
fast_swimmers = list(filter(lambda s: s.startswith('d'), swimmers))- itertools — набор инструментов для сложных последовательностей (chain, islice, combinations и т. д.).
Когда цикл не подходит или вызывает проблемы
- Большие массивы данных: для массивных численных расчётов лучше использовать векторизованные библиотеки (NumPy, pandas), они выполняют операции быстрее и эффективнее по памяти.
- Модификация списка во время итерации: удаление или вставка элементов прямо в списке, по которому вы итерируетесь, часто приводит к пропуску элементов или лишним итерациям. Решение — итерироваться по копии или собирать новые элементы в отдельный список.
- Требуется параллелизм: если операции независимы и CPU‑bound, имеет смысл рассмотреть multiprocessing или специализированные библиотеки; для I/O‑bound задач — asyncio.
- Нужна атомарность или транзакционность — циклы не решают вопросы синхронизации без дополнительных средств.
Шпаргалка: полезные сниппеты
Итерация с индексом и значением:
for i, val in enumerate(my_list):
print(i, val)Фильтрация: оставить только элементы, делящиеся на 5 (пример‑решение упражнения):
nums = [1, 5, 10, 12, 15, 23, 30, 44, 50, 99]
for n in nums:
if n % 5 == 0:
print(n)Списковое включение для той же задачи:
div_by_5 = [n for n in nums if n % 5 == 0]
print(div_by_5)Итерация в обратном порядке:
for x in reversed(my_list):
print(x)Параллельная итерация по двум спискам:
for a, b in zip(list_a, list_b):
process(a, b)Ментальные модели и эвристики
- Модель “чтения по строкам”: мысленно прогоняйте цикл так, будто листаете книгу — каждая страница (элемент) обрабатывается отдельно.
- “Пишу один раз, выполняю много раз”: код в теле цикла — шаблон операции.
- Если вам нужно изменить структуру данных, думайте сначала о создании нового списка, а не о изменении текущего inline.
Критерии приёмки (для упражнения)
Упражнение: создайте список из 10 целых чисел и напечатайте только те, которые делятся на 5.
Критерии приёмки:
- Код должен работать для произвольного списка из 10 чисел.
- Вывод должен содержать только числа, у которых n % 5 == 0.
- Порядок вывода должен соответствовать порядку в исходном списке.
- Если чисел, делящихся на 5, нет — программа не должна падать, можно вывести сообщение “Нет чисел, делящихся на 5” или ничего не выводить.
Пример ожидаемого вывода для nums = [1,5,10,12,15,23,30,44,50,99]:
5
10
15
30
50Автоматизированный тест‑скрипт (pytest):
import io
import sys
from program import print_div_by_five # предполагаемая функция
def test_print_div_by_five(capsys):
nums = [1,5,10,12,15,23,30,44,50,99]
print_div_by_five(nums)
captured = capsys.readouterr().out.strip().splitlines()
assert captured == ['5','10','15','30','50']Контрольные вопросы и дополнительные упражнения
- Что произойдёт, если во время итерации удалить элемент из списка? Как этого избежать?
- Напишите цикл, который выводит индекс и значение для каждого элемента списка.
- Реализуйте ту же задачу с использованием list comprehension и сравните читаемость кода.
- Используйте enumerate с параметром start=1, чтобы нумерация шла с единицы.
Роль‑ориентированные чек‑листы
Для студента:
- Написать простой for‑цикл и проверить вывод.
- Попробовать добавить второй оператор в теле цикла.
- Решить упражнение с числами, делящимися на 5.
Для ревьюера кода:
- Проверить, не модифицируется ли список во время итерации.
- Убедиться в читабельности имён переменных.
- Оценить, не лучше ли применить list comprehension или map для простого преобразования.
Для разработчика в продакшне:
- Оценить производительность (память/время) при больших списках.
- Подумать о потоках/процессах/асинхронности, если операции I/O‑bound или CPU‑bound.
Краткий глоссарий (одна строка на термин)
- Список: упорядоченная изменяемая коллекция Python, записывается в [ ].
- for loop: конструкция для перебора элементов итерируемого объекта.
- enumerate: встроенная функция, возвращающая пары (индекс, значение).
- генератор: ленивый источник значений, который вычисляет элементы по запросу.
Итог
Циклы — базовый инструмент для работы со списками в Python. Они позволяют писать компактный и понятный код для повторяющихся операций. Зная альтернативы (list comprehensions, генераторы, функции map/filter) и типичные ловушки (модификация списка при итерации, большие объёмы данных), вы сможете выбирать оптимальный инструмент для конкретной задачи.
Краткое задание на закрепление: создайте список из 10 чисел и выведите только те, которые делятся на 5. Проверьте решение с помощью простого теста.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone