Функции map и filter в Python | OTUS
Прямо сейчас идет открытый вебинар «Стабильность команды и взаимозаменяемость людей для QA Lead» . Присоединяйтесь!

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

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

Функция map

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

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

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

map(func, *iterables)

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

Screenshot_1-1801-7ea8d0.png

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

Screenshot_2-1801-cc3968.png

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

Screenshot_3-1801-235eb0.png

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

Screenshot_4-1801-2bb7a3.png

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

Screenshot_5-1801-f9e9e0.png

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

Screenshot_6-1801-7dd896.png

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

Screenshot_7-1801-227193.png

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

Screenshot_8-1801-cb2216.png

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

Screenshot_9-1801-6a50e4.png

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

Screenshot_10-1801-9971ff.png

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

Screenshot_11-1801-25bd3d.png

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

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

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

[5, 6, 6, 7, 5]

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

Screenshot_12-1801-3e14d8.png

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

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

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

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

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

Screenshot_13-1801-231970.png

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

Screenshot_14-1801-a243a2.png

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

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

И результат:

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

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

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

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

Screenshot_15-1801-15d9c3.png

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

Screenshot_16-1801-3ef6fb.png

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

Screenshot_17-1801-a620d5.png

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

Screenshot_18-1801-798307.png

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

Screenshot_19-1801-be39b8.png

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

Функция filter в Python

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

filter(func, *iterables)

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

Screenshot_20-1801-346313.png

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

Screenshot_21-1801-27e177.png

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

Screenshot_22-1801-f33925.png

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

Screenshot_23-1801-5c706f.png

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

Screenshot_24-1801-cdddbd.png

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

Screenshot_25-1801-e97633.png

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

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

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

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

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

Python_970x90-20219-8b1a8e.png

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

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто