Python
Цикл for по списку в Python
Цикл for по списку в Python берет элементы один за другим и выполняет для каждого элемента один и тот же блок кода. Это самый частый способ обработать набор данных: цены, имена, задачи, строки, словари с пользователями или товары в корзине
Главное преимущество for в том, что вам не нужно вручную управлять индексом. Python сам достает следующий элемент списка и кладет его в переменную цикла
По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы
Базовый обход списка
prices = [1200, 800, 2500]
for price in prices:
print(price)
Результат:
1200
800
2500
В строке for price in prices переменная price по очереди принимает значения 1200, 800, 2500. Когда элементы заканчиваются, цикл завершается
Хорошее имя переменной помогает читать код. Для списка prices логично взять price, для users — user, для tasks — task
Преобразовать каждый элемент
Допустим, нужно применить скидку 10 процентов к каждой цене
prices = [1200, 800, 2500]
for price in prices:
discounted_price = price * 0.9
print(discounted_price)
Результат:
1080.0
720.0
2250.0
Если результат нужно сохранить, создайте новый список
prices = [1200, 800, 2500]
discounted_prices = []
for price in prices:
discounted_prices.append(price * 0.9)
print(discounted_prices)
Результат:
[1080.0, 720.0, 2250.0]
Такой шаблон полезен, когда нужно подготовить данные для вывода, отчета или сохранения
Отфильтровать список
Фильтрация означает оставить только подходящие элементы
prices = [1200, 800, 2500, 500]
expensive = []
for price in prices:
if price > 1000:
expensive.append(price)
print(expensive)
Результат:
[1200, 2500]
Здесь цикл проходит по всем ценам, а if решает, добавлять текущую цену в новый список или нет
Еще пример: очистить список задач от пустых строк
tasks = ['написать код', '', ' ', 'запустить тесты']
clean_tasks = []
for task in tasks:
task = task.strip()
if task:
clean_tasks.append(task)
print(clean_tasks)
Результат:
['написать код', 'запустить тесты']
Сначала строка очищается от пробелов, потом пустые значения не попадают в итоговый список
Посчитать сумму
Для суммы создают переменную-накопитель
prices = [1200, 800, 2500]
total = 0
for price in prices:
total += price
print(total)
Результат:
4500
В реальном коде для простой суммы можно использовать sum(prices), но ручной цикл полезен для понимания накопления
Пример с условием: посчитать сумму только дорогих товаров
prices = [1200, 800, 2500, 500]
total = 0
for price in prices:
if price > 1000:
total += price
print(total)
Результат:
3700
Посчитать количество подходящих элементов
Счетчик похож на сумму, только увеличивается на единицу
tasks = ['готово', 'в работе', 'готово', 'ошибка']
done_count = 0
for task in tasks:
if task == 'готово':
done_count += 1
print(done_count)
Результат:
2
Так можно считать активных пользователей, пустые строки, ошибки, товары со скидкой или любые элементы, которые проходят проверку
Индекс через enumerate
Если нужен номер элемента, используйте enumerate()
tasks = ['код', 'тест', 'публикация']
for index, task in enumerate(tasks, start=1):
print(f'{index}. {task}')
Результат:
1. код
2. тест
3. публикация
enumerate() дает сразу две вещи: номер и сам элемент. Это обычно лучше, чем писать range(len(tasks))
Когда все-таки нужен индекс
Иногда индекс действительно нужен: например, нужно сравнить элемент с предыдущим или изменить значение по позиции
scores = [10, 20, 30]
for index in range(len(scores)):
scores[index] += 5
print(scores)
Результат:
[15, 25, 35]
Но если можно создать новый список, часто это читается спокойнее
scores = [10, 20, 30]
updated_scores = []
for score in scores:
updated_scores.append(score + 5)
print(updated_scores)
Не меняйте список во время обхода без причины
Опасный пример:
numbers = [1, 2, 3, 4]
for number in numbers:
if number % 2 == 0:
numbers.remove(number)
Когда вы удаляете элементы из списка во время обхода, индексы сдвигаются, и цикл может пропустить часть значений
Безопасный вариант — собрать новый список
numbers = [1, 2, 3, 4]
odd_numbers = []
for number in numbers:
if number % 2 != 0:
odd_numbers.append(number)
print(odd_numbers)
Результат:
[1, 3]
Частые ошибки
Путать элемент и индекс
names = ['Анна', 'Олег']
for name in names:
print(names[name])
Такой код ошибочный, потому что name — это строка, а не номер позиции
Ждать выполнения цикла на пустом списке
items = []
for item in items:
print(item)
print('Готово')
Цикл просто не выполнится, потому что элементов нет
Использовать сложную логику внутри одного цикла. Если внутри стало много условий и вложенности, вынесите часть кода в функцию с понятным именем
Практические задачи
Выведите все строки длиннее пяти символов
Посчитайте сумму цен больше 1000
Создайте новый список имен в верхнем регистре
Очистите список задач от пустых строк
Пронумеруйте список покупок через enumerate()
Соберите список пользователей, у которых active равен True
Цикл for по списку нужен, когда нужно пройти по каждому элементу и выполнить действие: вывести, проверить, преобразовать, посчитать или добавить в новый список
Начинайте с простого варианта for item in items. Если нужен номер, используйте enumerate(). Если хочется менять список во время обхода, сначала подумайте, нельзя ли собрать новый список безопаснее и понятнее