Фильтрация и накопление результата
Содержание курса
В прошлом уроке мы считали элементы списка по условию и искали минимум с максимумом — цикл for и переменная-счётчик стали основным инструментом. Сейчас сделаем следующий шаг: вместо того чтобы только считать подходящие элементы, будем их собирать в отдельный список.
Паттерн фильтрации: отбор элементов в новый список
Задача фильтрации выглядит так: есть список, и нужно выбрать из него только те элементы, которые удовлетворяют условию. Важный момент — исходный список не трогаем, результат кладём в новый.
Паттерн строится из четырёх шагов:
- Создать пустой список для результата:
result = [] - Перебрать исходный список циклом
for - Проверить каждый элемент через
if - Добавить подходящий элемент в результат:
result.append(element)
Вот конкретный пример — отфильтруем из списка оценок только те, что выше 60:
def filter_passing(scores):
result = []
for score in scores:
if score > 60:
result.append(score)
return result
print(filter_passing([45, 72, 58, 91, 63, 30]))
# [72, 91, 63]
Функция возвращает новый список — исходный scores остался нетронутым. Убедиться в этом просто: распечатайте scores после вызова, он будет тем же.
Ключевая деталь — инициализация result = [] перед циклом. Если написать её внутри цикла, список будет обнуляться на каждой итерации и в конце содержать максимум один элемент. Это одна из самых частых начальных ошибок при работе с накопительными паттернами.
Условие в if может быть любым: сравнение с числом, проверка типа, вхождение в диапазон. Паттерн от этого не меняется — меняется только сама проверка:
def filter_even(numbers):
result = []
for n in numbers:
if n % 2 == 0:
result.append(n)
return result
print(filter_even([1, 2, 3, 4, 5, 6]))
# [2, 4, 6]
Обратите внимание: append() работает in-place — он изменяет result и ничего не возвращает. Поэтому result = result.append(n) — ошибка: переменная станет None. Вызов всегда выглядит как отдельная строка: result.append(n).
Этот паттерн — основа для двух других, которые разберём дальше. Принцип перебора с проверкой остаётся тем же, меняется только то, что мы делаем с подходящим элементом.
