Функции 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.