← Назад к вопросам

Какие знаешь особенности filter в Python?

1.3 Junior🔥 61 комментариев
#Python Core

Комментарии (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 за его выразительность и производительность.