Функции map и filter в Python

Чтобы правильно пользоваться функциями или методами в Python, надо сначала понять их внутреннюю реализацию. Следует знать, какие аргументы они принимают и какие значения возвращают. В этой статье будет подробно рассмотрена работа таких полезных и часто используемых функций (functions), как map и filter.

Функция map

Ф-я map в Python 3 (three), способна принимать 2 аргумента: — iterable (итерируемый объект); — function (функция).

Функция применяется к каждому элементу объекта, а возвращаемым значением является объект map. Этот объект — итератор, который вы сможете конвертировать в список (множество), используя для этого встроенные функции.

Говоря простыми словами, функция map в Питоне даёт возможность преобразовывать элементы итерируемого объекта с учётом и в соответствии с какой-нибудь указанной функцией:

map(func, *iterables)

Дабы понять её работу, лучше всего привести пример. Давайте представим, что у нас существует некий упорядоченный список.

И у нас стоит задача получить множество (список), состоящее из квадратов этих чисел. Чтобы эту задачу решить, надо создать function по возведению числа в квадрат:

Теперь можно вызвать описываемую нами function map:

Учтите, что мы осуществляем передачу ссылки на функцию, записывая её имя без круглых скобок. По итогу наших действий, переменная b станет ссылаться на итератор map. Теперь для перебора всех значений мы можем использовать известную function next:

Также можно сформировать новый список, используя функцию list:

Итак, функция map применяет к каждому элементу списка lst функцию sq, возвращая объект-генератор, что необходимо в целях последовательного выбора новых значений, прошедших преобразование. В каком-то смысле речь идёт об эквиваленте следующего выражения-генератора:

Или же такого списка:

Следует обратить внимание, что function sq либо какая-нибудь иная функция должна принимать лишь один аргумент во всех случаях. В обратном случае мы получим ошибку. В качестве примера можно привести запись ниже, которая будет ошибочной:

Возвращать же function map может несколько аргументов, как в примере ниже:

В итоге мы получим следующий код:

А результатом его работы станет список кортежей:

Вышеописанные преобразования вы можете осуществлять с любыми типами данных, с теми же строками:

lst = ["Минск", "Гродно", "Гомель", "Могилев", "Брест"]
b = map(len, lst)
a = list(b)
print(a)

В результате работы кода будет сформирован список с длинами указанных строк:

[5, 6, 6, 7, 5]

Если же необходимо задействовать встроенные строковые методы, сделать это можно следующим образом:

Иногда бывает, что в качестве первого аргумента функции map указывают лямбда-функции (так называемые анонимные функции):

b = map(lambda x: x[::-1], lst)

В результате работы такого кода вы получите на выходе строки, которые будут записаны в обратном порядке (наоборот).

Идём дальше. Так как в Python функция map принимает 2-м аргументом любой итерируемый объект, у разработчика есть возможность результат работы 1-й функции map задействовать во второй функции map.

Первая функция:

Вторая функция:

Ещё раз код целиком:

lst = ["Минск", "Гродно", "Гомель", "Могилев", "Брест"]
b = map(lambda x: x.replace("а", "А"), lst)
c = map(sorted, b)
res1 = list(c)
print(res1)

И результат:

[['М', 'и', 'к', 'н', 'с'], ['Г', 'д', 'н', 'о', 'о', 'р'], ['Г', 'е', 'л', 'м', 'о', 'ь'], ['М', 'в', 'г', 'е', 'и', 'л', 'о'], ['Б', 'е', 'р', 'с', 'т']]

То есть в нашем примере строки коллекции b ["Минск", "Гродно", "Гомель", "Могилев", "Брест"] оказались преобразованы в перечень символов, которые отсортированы по возрастанию.

Где ещё используется функция map?

Также нередко функцию map применяют для ввода ряда чисел с клавиатуры через какой-нибудь разделитель, тот же, пробел. Напишем очередной код:

Если станем вводить целые числовые значения через пробел, при исполнении функции int появится ошибка, ведь пробел не является цифровым символом. Теперь разобьем данную строку по пробелам:

В итоге получим список из строк, где записаны введенные числовые значения. Однако функцию int следует применять не к списку, а к конкретной строке. Операция ниже тоже закончится ошибкой:

Проблему решит функция map. С её помощью реализовать ввод можно так:

По итогу будет создан генератор для получения введенных числовых значений. Однако всё это намного удобнее сразу преобразовать к списку:

В результате, если будем вводить любое количество числовых значений через пробел, будет получаться упорядоченный список, который состоит из чисел. Согласитесь, иногда это бывает весьма удобно.

Функция filter в Python

Очередная функция, заслуживающая внимания, называется filter. С её помощью выполняется возврат элементов, для которых переданная ей функция, в свою очередь, возвращает True:

filter(func, *iterables)

Давайте предположим, что у нас существует список, из которого мы хотим отобрать нечётные значения:

Для этого следует определить функцию:

Потом вызвать filter:

В итоге получим итератор. Его можно перебрать так:

Перебор можно реализовать и посредством цикла:

Также есть возможность выполнить преобразование итератора в список:

Использовать функцию filter можно с любыми типами данных, с теми же строками. Представим, что у нас есть в наличии следующий кортеж:

lst = ("Гродно", "Гомель1", "Минск", "Витебск2", "Брест")
b = filter(str.isalpha, lst)
for x in b:
    print(x, end=" ")

Давайте вызовем метод строк isalpha, возвращающий True в том случае, когда в строке находятся лишь буквенные символы. В итоге в консоли получим следующий результат:

Гродно Минск Брест

На этом всё, если хотите освоить язык программирования Python на более высоком уровне, добро пожаловать на курсы OTUS!

Источники: • https://proproprogs.ru/python_base/funkcii-map-filter-zip; • https://pythonru.com/osnovy/funkcija-map-v-python.