Что такое функция filter() в Python?

Ответ

filter() — это встроенная функция Python, которая создает итератор из элементов итерируемого объекта, для которых заданная функция-фильтр возвращает True.

Синтаксис:

filter(function, iterable)

Практический пример: Отфильтруем только четные числа из списка.

numbers = [1, 2, 3, 4, 5, 6, 7, 8]

# Используем lambda-функцию как фильтр
even_numbers_iterator = filter(lambda x: x % 2 == 0, numbers)

# filter() возвращает итератор, поэтому для получения списка используем list()
print(list(even_numbers_iterator))  # Вывод: [2, 4, 6, 8]

Важные особенности:

  1. Функция-фильтр: Первый аргумент — функция, которая применяется к каждому элементу. Она должна возвращать True (элемент проходит) или False (элемент отбрасывается). Если передать None, filter() отберет только «истинные» элементы (те, для которых bool(element) равно True).
    mixed_list = [0, 1, False, True, '', 'hello', [], [1,2]]
    print(list(filter(None, mixed_list)))  # Вывод: [1, True, 'hello', [1, 2]]
  2. Возвращаемое значение: Функция возвращает итератор (объект filter), а не список. Это экономит память при работе с большими последовательностями. Для материализации результата нужна list(), tuple() или цикл for.
  3. Альтернатива — list comprehension: Часто аналогичную операцию записывают короче через генератор списка, что считается более «питоническим» стилем для простых случаев.
    # Эквивалент с list comprehension:
    even_numbers_list = [x for x in numbers if x % 2 == 0]

    filter() предпочтительнее в функциональном стиле программирования или когда функция-фильтр уже определена.

Ответ 18+ 🔞

А, filter()! Ну это ж классика, ебать мои старые костыли. Функция, которая как швейцар в ночном клубе: одних пропускает, других — нахуй. Берёт твою кучу данных и отсеивает всё ненужное, оставляя только то, что по условию подходит.

Как выглядит:

filter(функция_фильтр, то_что_фильтруем)

Пример, чтобы не быть голословным: Допустим, у тебя список чисел, а тебе нужны только чётные. Не перебирать же их вручную, ёпта.

numbers = [1, 2, 3, 4, 5, 6, 7, 8]

# Лямбдой задаём условие: "оставь только те x, где остаток от деления на ноль равен нулю"
even_numbers_iterator = filter(lambda x: x % 2 == 0, numbers)

# Внимание, подвох! Он тебе не список вернёт, а итератор — ленивую сволочь.
# Чтобы всё увидеть, надо его в list() завернуть.
print(list(even_numbers_iterator))  # Напечатает: [2, 4, 6, 8]

А теперь нюансы, без которых нихуя не понятно:

  1. Про функцию-фильтр. Это твой критерий отбора. Она должна говорить True ("проходи") или False ("иди нахуй"). А если ты передашь вместо функции None — будет отбор по принципу "правда/ложь". Оставит только те элементы, которые сами по себе True считаются.

    mixed_list = [0, 1, False, True, '', 'hello', [], [1,2]]
    print(list(filter(None, mixed_list)))  # Вывод: [1, True, 'hello', [1, 2]]

    Видишь? Нолики, пустые строки и списки — всё на выброс. Только истинные значения прошли.

  2. Он возвращает итератор, ёклмн! Это не список, не кортеж. Это такая хитрая жопа, которая не хранит все данные сразу, а генерит их по мере надобности. Памяти жрёт мало, но чтобы увидеть результат разом — нужно его в list() или tuple() завернуть, либо в цикле for прогнать.

  3. Альтернатива есть всегда. Часто ту же хрень можно сделать через list comprehension (генератор списка), и это даже короче и питоничнее выглядит.

    # То же самое, но через list comprehension:
    even_numbers_list = [x for x in numbers if x % 2 == 0]

    Так в чём же смысл filter()? Ну, во-первых, это дань уважения функциональному стилю. Во-вторых, если у тебя уже есть готовая функция-фильтр с именем, то filter(имя_функции, данные) читается очень даже неплохо. А в-третьих, иногда просто лень квадратные скобки писать, понимаешь?