Перебор списка в Python: for по элементам
Автор: Казачкин Даниил Михайлович · Обновлено
Цикл for может получать элементы списка напрямую. На каждой итерации переменная цикла связывается с очередным значением, поэтому для обычного вычисления индексы не нужны. Это уменьшает риск ошибки на единицу.
Преобразование при чтении
prices = [120, 80, 250]
for price in prices:
discounted = price * 0.9
print(f'{discounted:.2f}')Вывод:
108.00
72.00
225.00Переменная discounted создаётся заново для каждого элемента. Исходный список prices не меняется, потому что код лишь читает price.
Когда нужен индекс
Если требуется номер, используйте enumerate: for index, value in enumerate(prices). По умолчанию index начинается с нуля, а параметр start=1 удобен для человеческой нумерации. Не пишите range(len(prices)) без причины: прямой перебор проще.
Изменение переменной price не заменяет элемент списка. Команда price = 0 связывает локальное имя с новым числом. Для изменения коллекции нужен индекс либо создание нового списка. Также опасно добавлять элементы в тот же список во время перебора: длина меняется, и цикл может обработать неожиданные значения.
Статистика оценок
Для списка [5, 4, 3, 5, 2] выведите каждую оценку с номером от 1, найдите сумму и количество пятёрок одним циклом. Ожидаются сумма 19 и две пятёрки. Проверьте список из одного элемента и пустой список. Затем создайте новый список doubled, добавляя удвоенные значения, не меняя исходный. Сравните оба результата.
Чтение без изменения коллекции
Для списка расстояний вычислите новый список километров из метров, не меняя источник. Сначала используйте обычный for и append, затем сравните с list comprehension. Добавьте enumerate и выведите человеческие номера от единицы. После этого намеренно присвойте новое значение переменной цикла и подтвердите, что элементы исходного списка остались прежними. Отдельно попробуйте замену по индексу и увидьте настоящий эффект. В выводе упражнения должны присутствовать original и converted, чтобы различие наблюдалось. Выберите версию, в которой наиболее ясно отделены чтение исходных данных и построение результата.
Практикум: позиции подходящих элементов
Для списка температур выведите индекс и значение каждого отрицательного элемента через enumerate. Сначала используйте индексы с нуля, затем номера дней с единицы через параметр start. Проверьте пустой список и повторяющиеся значения. Сравните перебор элементов с range(len(values)): индекс нужен только потому, что входит в ответ. Затем найдите позицию первого минимума, не перезаписывая её при равном значении. Формат результата должен явно отличать индекс программы от человеческого номера.
Контрольная точка
Когда цикл for value in values содержит достаточно данных, а когда нужен enumerate? Назовите конкретную операцию, использующую позицию, иначе индекс является лишним состоянием.
Частые вопросы
enumerate создаёт новый список?
Нет, он возвращает перебираемый объект пар «счётчик — элемент». Это позволяет получать позиции по мере прохода без ручного обновления отдельной переменной.