Все мы любим Python за лаконичность и мощь. Но вот когда доходит до обработки списков и фильтрации данных, новички часто начинают городить велосипеды с циклами for
и условиями. А ведь есть же filter()
— простая, но недооценённая функция из стандартной библиотеки, которая способна превратить унылый цикл в элегантную строку кода. Давайте разберёмся, зачем она нужна, как ей пользоваться и какие грабли можно встретить.
Возможности
- Фильтрация любого итерируемого объекта (списки, кортежи, множества, строки и даже генераторы)
- Работает с любой функцией, которая возвращает
True
илиFalse
- Ленивая — не грузит память зря
- Легко комбинируется с
lambda
,map()
, генераторами и даже pandas
Что требуется
- Python 3.x (filter работает и в Python 2, но там нюансы — лучше сразу использовать 3.x)
- Любая ОС: Linux, macOS, Windows — неважно, filter встроен в стандартную библиотеку
- Железо — любое, filter не прожорливый
- Желательно уметь запускать скрипты через терминал или IDE
Установка — пошаговая инструкция
- Устанавливаем Python 3
- Linux:
sudo apt install python3
(Ubuntu/Debian) - macOS:
brew install python
(если есть Homebrew) - Windows: python.org/downloads
- Linux:
- Проверяем установку:
python3 --version
илиpython --version
- Никаких дополнительных библиотек не требуется —
filter()
уже есть в стандартной библиотеке! - Открываем любимый редактор или IDE (PyCharm, VSCode, vim, nano — что угодно)
- Пишем тестовый скрипт:
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-объекта и всегда приводите его к списку, если нужен результат сразу. Ну и читайте официальную документацию — там всегда есть что-то интересное!
Ваш отзыв