В этой статье мы поговорим о лямбда-функциях, их применении в Python, их достоинствах и особенностях использования.
Что такое Lambda-функции
Небольшие функции в пару строк кода можно заменить анонимной функцией — lambda [1], не имеющей уникального идентификатора. Python предназначен для того, чтобы писать лаконичный код, который мы обсуждали тут. И lambda-функции отлично помогают в этом.
Например, требуется функция, которая считает квадратное уравнение. Можно ее написать через def
:
>>> def f(x): ... return x**2 + 2*x + 1 >>> f(5) 36
А можно написать через анонимную лямбда-функцию:
>>> f = lambda x: x**2 + 2*x + 1 >>> f(5) 36
Заметим, передача аргументов осуществляется без скобок.
В Python все является объектами, в том числе и функции. Поэтому их можно передавать в качестве аргументов и возвращать их. Рассмотрим подобный пример:
>>> def calculate(n): ... return lambda z, y: n*z + y ... >>> c = calculate(3) >>> c(2, 4) 10
Здесь функция calculate принимает n
и возвращает лямбда-функцию, принимающая два аргумента z
и y
через запятую и вычисляющая соответствующее выражение.
Применение lambda в sort, filter, map, reduce
На практике сортировка – одна из самых популярных манипуляций с данными. Например, имеется список слов, которые нужно отсортировать по последней букве. Для этого нужно указать аргумент key
– функцию, с помощью которой будет происходить сравнение элементов. Этой функцией может служить наша lambda:
>>> words = ['Лапа', 'тапок', 'огонь', 'сердце'] >>> sorted(words, key=lambda x: x[-1]) ['Лапа', 'сердце', 'тапок', 'огонь']
В качестве индекса мы указали -1, обозначающий последний элемент строки (str), т.е. последней буквы.
Вторым применением lamda-функций является фильтрация различных структур данных. Например, необходимо исключить все четные элементы в списке. Для этого имеется встроенная в Python функция filter
:
>>> nums = [1, 2, 3, 4, 5, 6, 7] >>> even = filter(lambda x: x % 2 == 0, nums) >>> list(even) [2, 4, 6]
filter
принимает первым аргументом функцию, через которую осуществляется фильтрация элементов. В данном случае мы использовали анонимную функцию.
Третий пример – это использование lambda-функций в отображениях нового пространства. Требуется из заданного списка чисел получить список кубов этих чисел. С помощью map
это будет выглядеть так:
>>> nums = [1, 2, 3, 4, 5, 6, 7] >>> cubes = map(lambda x: x**3, nums) >>> list(cubes) [1, 8, 27, 64, 125, 216, 343]
map
принимает первым аргументом функцию, отображающую список в новом пространстве. Здесь была использована анонимная функция, которая возводит элемент в 3-ю степень.
Четвертый пример, где используется lambda-функции – это reduce
. Если необходимо получить из списка одно значение, то используется reduce
из Python-модуля functools
. Получение произведения чисел в списке будет выглядеть следующим образом:
>>> nums = [1, 2, 3, 4, 5, 6, 7] >>> reduce(lambda x, y: x * y, nums) 5040
Алгоритм выполнения reduce можно записать как ((((((1*2)*3)*4)*5)*6)*7)
. Каждый момент итерирования сопровождается обновлением первого аргумента lambda-функции x, таким образом, становясь результатом произведения.
Стоит отметить, не всегда lambda-функции являются уместными из-за их неочевидного интерфейса. Например, filter
и map
могут быть переписаны через List comprehension, о котором мы говорили тут. Как использовать lambda-функции и List comprehension в реальных проектах Data Science, вы узнаете на наших практических курсах по Python в лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве.