Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Filter в Python: особенности и применение
Filter — встроенная функция высшего порядка, которая применяет функцию-предикат ко всем элементам итерируемого объекта и возвращает только те элементы, для которых функция вернула True.
Ключевые особенности
1. Ленивое вычисление (lazy evaluation)
numbers = [1, 2, 3, 4, 5, 6]
filtered = filter(lambda x: x > 3, numbers)
# На этом моменте вычисления не происходят!
result = list(filtered) # Вычисления происходят только здесь
Filter возвращает объект-итератор, а не список. Это экономит память при работе с большими данными.
2. Работа с None в качестве функции
data = [0, False, 1, 'hello', '', None, [], [1, 2]]
# filter(None, data) удаляет все ложные значения
result = list(filter(None, data))
# [1, 'hello', [1, 2]]
3. Функция-предикат может быть None
# Эквивалентно bool(x) для каждого элемента
numbers = [0, 1, 2, False, 3, None, 4]
result = list(filter(None, numbers))
Сравнение с альтернативами
List comprehension (более Pythonic)
numbers = [1, 2, 3, 4, 5, 6]
# Использование filter
filtered_filter = list(filter(lambda x: x > 3, numbers))
# Используя list comprehension
filtered_list = [x for x in numbers if x > 3]
# Результат идентичен: [4, 5, 6]
Map + Filter вместе
# Фильтруем и преобразуем одновременно
numbers = [1, 2, 3, 4, 5]
result = list(map(lambda x: x * 2, filter(lambda x: x > 2, numbers)))
# Но можно проще:
result = [x * 2 for x in numbers if x > 2] # [6, 8, 10]
Практические примеры
Фильтрация объектов
class User:
def __init__(self, name, age):
self.name = name
self.age = age
users = [User('Alice', 25), User('Bob', 17), User('Charlie', 30)]
adults = list(filter(lambda u: u.age >= 18, users))
Удаление пустых строк
lines = ['hello', '', 'world', ' ', 'python']
non_empty = list(filter(str.strip, lines)) # Использование метода как функции
Когда использовать filter()
- Используй filter(): когда нужна ленивая обработка больших потоков данных
- Используй list comprehension: в большинстве случаев (код понятнее и быстрее)
- Используй встроенные методы: например .strip() для строк
Производительность
import timeit
numbers = list(range(1000))
# list comprehension быстрее
time1 = timeit.timeit(lambda: [x for x in numbers if x > 500], number=10000)
time2 = timeit.timeit(lambda: list(filter(lambda x: x > 500, numbers)), number=10000)
print(f'List comprehension: {time1}')
print(f'Filter: {time2}') # Filter обычно медленнее в Python
Вывод: Filter в Python — полезный инструмент, но в современном Python предпочитают list comprehension за его выразительность и производительность.