Ответ
Обе функции обрабатывают итерируемые объекты, но решают разные задачи:
map()
— применяет функцию к каждому элементу последовательности и возвращает итератор с преобразованными элементами.filter()
— проверяет каждый элемент с помощью функции-условия и возвращает итератор только с теми элементами, для которых условие истинно.
map(function, iterable)
Преобразует каждый элемент. Количество элементов в результате всегда равно количеству в исходной последовательности.
Пример: Получить квадраты чисел.
numbers = [1, 2, 3, 4]
squared_iterator = map(lambda x: x * x, numbers)
# Чтобы увидеть результат, преобразуем итератор в список
print(list(squared_iterator)) # Вывод: [1, 4, 9, 16]
filter(function, iterable)
Отбирает элементы по условию. Количество элементов в результате меньше или равно исходному.
Пример: Оставить только четные числа.
numbers = [1, 2, 3, 4, 5, 6]
even_iterator = filter(lambda x: x % 2 == 0, numbers)
print(list(even_iterator)) # Вывод: [2, 4, 6]
Альтернатива: Списковые включения (List Comprehensions)
Часто более читаемым и "pythonic" способом для тех же задач являются списковые включения.
numbers = [1, 2, 3, 4]
# Аналог map
squared_list = [x * x for x in numbers]
# [1, 4, 9, 16]
# Аналог filter
even_list = [x for x in numbers if x % 2 == 0]
# [2, 4]