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
Частые ошибки
Использование filter с неитерируемым объектом:
result = filter(lambda x: x > 0, 10) # Ошибка: TypeError
Как исправить: Передайте итерируемый объект, например список или строку.
Попытка сразу преобразовать результат в список, не вызвав list():
filtered = filter(lambda x: x > 0, [1, -2, 3]) print(filtered) # Вывод: <filter object at 0x00000250A2BCB250>
Как исправить: Используйте list(filtered) или другой способ итерации.
Часто задаваемые вопросы
Можно ли использовать filter() с функцией, которая возвращает не булево значение? Можно. Возвращаемые значения будут приведены к True или False с помощью bool.
data = [-2, -1, 0, 1, 2] print(list(filter(lambda x: x + 1, data))) # Вывод: [-2, 0, 1, 2]