July 24, 2018

lambda, map и filter в Python

Разберёмся с этими тремя элементами Python, которые очень часто применяются вместе, потому и были объединены мной в одну статью.

Первой я хочу рассмотреть конструкцию lambda. Это способ определения анонимной функции("лямбды", как их ещё называют). Тут слово "анонимный" никак не связано с Роскомнадзором и сетью Tor, просто у таких функций нет имени. Постойте, а как к ним обращаться? А нам это и не нужно, мы хотим просто передать простенькую функцию как аргумент куда-нибудь и забыть про неё.

Объявляются такие функции следующим образом:

lambda <аргументы>: <выражение>

Например вот функция, которая возвращает куб данного числа:

lambda x: x**3

Красиво, просто, пока непонятно зачем. Для примера обратимся к методу sort и сделаем сортировку по обратному значению(даже не спрашивайте зачем).

a = [1, -2, 4, 5, 228, -322]
a.sort(key=lambda x: 1/x)  # [-2, -322, 228, 5, 4, 1]

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

map принимает 2 аргумента: функцию и массив, и возвращает список(на самом деле специальный map объект), в котором ко всем элементам массива применили нашу функцию. Так как с map объектом мы ничего интересного сделать не можем, то его мы превратим обратно в список.

a = [1, -2, 4, 5, 228, -322]
mapped = list(map(lambda x: x**2, a))  # Список квадратов чисел

filter принимает всё те же 2 аргумента и возвращает filter объект(который опять же мы превратим в список), в котором остались только те элементы, на которых функция истинна. Например:

a = [1, -2, 4, 5, 228, -322]
filtered = list(filter(lambda x: x < 10, a))  # Список чисел меньше 10

Благодаря этим двум функциям и конструкции lambda можно сократить рутинный код до однострочника. Однако сильно увлекаться этим не стоит, а то рискуете сделать свою программу нечитаемой.

Больше статей в группе SnakeBlog