filter

Функция filter() возвращает итератор, содержащий элементы, для которых заданная функция возвращает True. Она используется для фильтрации данных из последовательности.

Синтаксис

filter(function, iterable)

Аргументы

  • function:
    • Что означает: Функция, которая применяется к каждому элементу iterable. Если функция возвращает True, элемент включается в результат.
    • Возможные значения: Любая функция, принимающая один аргумент. Можно передать None, чтобы использовать предикат истинности (функцию bool).
  • iterable:
    • Что означает: Итерируемый объект, элементы которого нужно фильтровать.
    • Возможные значения: Список, кортеж, строка, множество, словарь или любой другой итерируемый объект.

Возвращаемое значение

Итератор, содержащий элементы из iterable, для которых функция вернула True.

Примеры использования

# Фильтрация четных чисел
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(even_numbers))  # Вывод: [2, 4, 6]
# Фильтрация строк длиной больше 3 символов
words = ["cat", "elephant", "dog", "horse"]
long_words = filter(lambda w: len(w) > 3, words)
print(list(long_words))  # Вывод: ['elephant', 'horse']
# Использование None как функции для фильтрации истинных значений
mixed_values = [0, 1, "", "Hello", [], [1, 2], None]
truthy_values = filter(None, mixed_values)
print(list(truthy_values))  # Вывод: [1, 'Hello', [1, 2]]

Эквивалентный код

def pyplanet_filter(function, iterable):
    if function is None:
        function = bool
    for item in iterable:
        if function(item):
            yield item

Частые ошибки

  1. Использование filter с неитерируемым объектом:

    result = filter(lambda x: x > 0, 10)  # Ошибка: TypeError
    

    Как исправить: Передайте итерируемый объект, например список или строку.

  2. Попытка сразу преобразовать результат в список, не вызвав list():

    filtered = filter(lambda x: x > 0, [1, -2, 3])
    print(filtered)  # Вывод: <filter object at 0x00000250A2BCB250>
    

    Как исправить: Используйте list(filtered) или другой способ итерации.

Часто задаваемые вопросы

  1. Можно ли использовать filter() с функцией, которая возвращает не булево значение? Можно. Возвращаемые значения будут приведены к True или False с помощью bool.

    data = [-2, -1, 0, 1, 2]
    print(list(filter(lambda x: x + 1, data)))  # Вывод: [-2, 0, 1, 2]