Lambda-функции позволяют писать в Python-стиле

В этой статье мы поговорим о лямбда-функциях, их применении в 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 в лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве.

Источники
  1. https://docs.python.org/3.5/tutorial/controlflow.html#lambda-expressions

Добавить комментарий

Поиск по сайту