Ответ
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]
Важные особенности:
- Функция-фильтр: Первый аргумент — функция, которая применяется к каждому элементу. Она должна возвращать
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]] - Возвращаемое значение: Функция возвращает итератор (объект
filter), а не список. Это экономит память при работе с большими последовательностями. Для материализации результата нужнаlist(),tuple()или циклfor. - Альтернатива — 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]
А теперь нюансы, без которых нихуя не понятно:
-
Про функцию-фильтр. Это твой критерий отбора. Она должна говорить
True("проходи") илиFalse("иди нахуй"). А если ты передашь вместо функцииNone— будет отбор по принципу "правда/ложь". Оставит только те элементы, которые сами по себеTrueсчитаются.mixed_list = [0, 1, False, True, '', 'hello', [], [1,2]] print(list(filter(None, mixed_list))) # Вывод: [1, True, 'hello', [1, 2]]Видишь? Нолики, пустые строки и списки — всё на выброс. Только истинные значения прошли.
-
Он возвращает итератор, ёклмн! Это не список, не кортеж. Это такая хитрая жопа, которая не хранит все данные сразу, а генерит их по мере надобности. Памяти жрёт мало, но чтобы увидеть результат разом — нужно его в
list()илиtuple()завернуть, либо в циклеforпрогнать. -
Альтернатива есть всегда. Часто ту же хрень можно сделать через list comprehension (генератор списка), и это даже короче и питоничнее выглядит.
# То же самое, но через list comprehension: even_numbers_list = [x for x in numbers if x % 2 == 0]Так в чём же смысл
filter()? Ну, во-первых, это дань уважения функциональному стилю. Во-вторых, если у тебя уже есть готовая функция-фильтр с именем, тоfilter(имя_функции, данные)читается очень даже неплохо. А в-третьих, иногда просто лень квадратные скобки писать, понимаешь?