Функция filter() в Python: фильтрация данных с примерами

Все мы любим Python за лаконичность и мощь. Но вот когда доходит до обработки списков и фильтрации данных, новички часто начинают городить велосипеды с циклами for и условиями. А ведь есть же filter() — простая, но недооценённая функция из стандартной библиотеки, которая способна превратить унылый цикл в элегантную строку кода. Давайте разберёмся, зачем она нужна, как ей пользоваться и какие грабли можно встретить.

Возможности

  • Фильтрация любого итерируемого объекта (списки, кортежи, множества, строки и даже генераторы)
  • Работает с любой функцией, которая возвращает True или False
  • Ленивая — не грузит память зря
  • Легко комбинируется с lambda, map(), генераторами и даже pandas

Что требуется

  • Python 3.x (filter работает и в Python 2, но там нюансы — лучше сразу использовать 3.x)
  • Любая ОС: Linux, macOS, Windows — неважно, filter встроен в стандартную библиотеку
  • Железо — любое, filter не прожорливый
  • Желательно уметь запускать скрипты через терминал или IDE

Установка — пошаговая инструкция

  1. Устанавливаем Python 3
    • Linux: sudo apt install python3 (Ubuntu/Debian)
    • macOS: brew install python (если есть Homebrew)
    • Windows: python.org/downloads
  2. Проверяем установку: python3 --version или python --version
  3. Никаких дополнительных библиотек не требуетсяfilter() уже есть в стандартной библиотеке!
  4. Открываем любимый редактор или IDE (PyCharm, VSCode, vim, nano — что угодно)
  5. Пишем тестовый скрипт:
    numbers = [1, 2, 3, 4, 5, 6]
    even = filter(lambda x: x % 2 == 0, numbers)
    print(list(even))
    

    Должно вывести: [2, 4, 6]

Использование: полный список команд и вариантов

  • Базовый синтаксис:
    filter(function, iterable)

    function — функция, возвращающая True/False
    iterable — любой итерируемый объект

  • Пример с обычной функцией:
    def is_positive(num):
        return num > 0
    
    numbers = [-2, -1, 0, 1, 2]
    positives = filter(is_positive, numbers)
    print(list(positives))  # [1, 2]
    
  • Пример с lambda:
    words = ['apple', '', 'banana', '', 'cherry']
    non_empty = filter(lambda w: w, words)
    print(list(non_empty))  # ['apple', 'banana', 'cherry']
    
  • Фильтрация строк:
    s = "a1b2c3"
    digits = filter(str.isdigit, s)
    print(''.join(digits))  # '123'
    
  • Фильтрация с None:
    data = [0, 1, False, 2, '', 3]
    filtered = filter(None, data)
    print(list(filtered))  # [1, 2, 3]
    

    Если передать None вместо функции — отфильтрует все «ложные» значения.

  • Работа с генераторами:
    def gen():
        for i in range(10):
            yield i
    
    even = filter(lambda x: x % 2 == 0, gen())
    print(list(even))  # [0, 2, 4, 6, 8]
    
  • Комбинирование с map:
    numbers = [1, 2, 3, 4, 5]
    squared_evens = map(lambda x: x**2, filter(lambda x: x % 2 == 0, numbers))
    print(list(squared_evens))  # [4, 16]
    

Ошибки, как делать не надо

  • Забыли преобразовать filter-объект в список:
    f = filter(lambda x: x > 0, [-1, 1, 2])
    print(f)  # filter object, не список!
    

    Используйте list(f) или for x in f:

  • Используете filter для side-effect функций:
    def print_and_return(x):
        print(x)
        return True
    
    filter(print_and_return, [1,2,3])  # Не для этого filter!
    

    filter не для побочных эффектов, а для фильтрации.

  • Пытаетесь фильтровать неитерируемое:
    filter(lambda x: x > 0, 123)  # TypeError
    

    Второй аргумент должен быть итерируемым!

  • Забыли, что filter «одноразовый»:
    f = filter(lambda x: x > 0, [1,2,3])
    list(f)
    list(f)  # Уже пусто!
    

Пример реального использования в окружении

Реальная задача: есть лог-файл, нужно быстро отфильтровать строки с ошибками.

with open('app.log') as f:
    errors = filter(lambda line: 'ERROR' in line, f)
    for err in errors:
        print(err.strip())

Логика проста: читаем файл построчно (итерируемый объект!), фильтруем по ключевому слову, выводим результат. Без лишних циклов, быстро и по-питоновски.

Заключение

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

Хотите прочитать больше про Разное?
Отзывов нет.

Ваш отзыв

Пожалуйста, заполните поля снизу и добавьте отзыв!.
Имя *
E-mail *
Сайт
Сообщение *