Гид по технологиям

Циклы и списки в Python: как перебирать элементы

6 min read Python Обновлено 08 Jan 2026
Как перебирать списки в Python — цикл for
Как перебирать списки в Python — цикл for

Логотип Python для веб‑разработки

Почему нужны циклы

Если вы храните несколько значений в списке, часто возникает задача применить одну и ту же операцию к каждому элементу: вывести значение, посчитать среднее, преобразовать формат или отфильтровать элементы по условию. Ручное обращение к каждому элементу неудобно и небезопасно — код становится громоздким и трудночитаемым.

Циклы решают эти задачи: вы пишете логику один раз, а Python выполняет её для каждого элемента автоматически. Это экономит время, снижает шанс ошибок и упрощает поддержку кода.

Важно: термин «список» (list) — упорядоченная коллекция объектов в квадратных скобках. Цикл for — конструкция языка для итерации по коллекции.

Пример: список победителей «Пловец года» (2016–2019)

Допустим, у нас есть список американских пловцов, получивших награду «Пловец года» в 2016–2019. Без цикла пришлось бы обращаться к элементам по одному — громоздко и неэффективно. С помощью for задача решается просто:

swimmers = ['phelps', 'dressel', 'kalisz', 'dressel']
for swimmer in swimmers:
    print(swimmer)

Объяснение по шагам:

  1. Создаём список swimmers и записываем в него имена победителей.
  2. Запускаем цикл for: Python берёт первый элемент списка и присваивает его переменной swimmer.
  3. Выполняем тело цикла — в примере это print(swimmer).
  4. После завершения тела цикла 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.

Критерии приёмки:

  1. Код должен работать для произвольного списка из 10 чисел.
  2. Вывод должен содержать только числа, у которых n % 5 == 0.
  3. Порядок вывода должен соответствовать порядку в исходном списке.
  4. Если чисел, делящихся на 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']

Контрольные вопросы и дополнительные упражнения

  1. Что произойдёт, если во время итерации удалить элемент из списка? Как этого избежать?
  2. Напишите цикл, который выводит индекс и значение для каждого элемента списка.
  3. Реализуйте ту же задачу с использованием list comprehension и сравните читаемость кода.
  4. Используйте enumerate с параметром start=1, чтобы нумерация шла с единицы.

Роль‑ориентированные чек‑листы

Для студента:

  • Написать простой for‑цикл и проверить вывод.
  • Попробовать добавить второй оператор в теле цикла.
  • Решить упражнение с числами, делящимися на 5.

Для ревьюера кода:

  • Проверить, не модифицируется ли список во время итерации.
  • Убедиться в читабельности имён переменных.
  • Оценить, не лучше ли применить list comprehension или map для простого преобразования.

Для разработчика в продакшне:

  • Оценить производительность (память/время) при больших списках.
  • Подумать о потоках/процессах/асинхронности, если операции I/O‑bound или CPU‑bound.

Краткий глоссарий (одна строка на термин)

  • Список: упорядоченная изменяемая коллекция Python, записывается в [ ].
  • for loop: конструкция для перебора элементов итерируемого объекта.
  • enumerate: встроенная функция, возвращающая пары (индекс, значение).
  • генератор: ленивый источник значений, который вычисляет элементы по запросу.

Итог

Циклы — базовый инструмент для работы со списками в Python. Они позволяют писать компактный и понятный код для повторяющихся операций. Зная альтернативы (list comprehensions, генераторы, функции map/filter) и типичные ловушки (модификация списка при итерации, большие объёмы данных), вы сможете выбирать оптимальный инструмент для конкретной задачи.

Краткое задание на закрепление: создайте список из 10 чисел и выведите только те, которые делятся на 5. Проверьте решение с помощью простого теста.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство