Определение лямбда-функций
В Python, помимо функций, определяемых оператором def, существуют анонимные функции, также называемые лямбда-функциями. Обычные функции определяются с помощью def и имеют уникальное имя. Анонимные функции определяются оператором lambda. Лямбда-функция — это функция, состоящая из одного выражения, вычисляемого при вызове.
Простейшее лямбда-выражение
Простейшее лямбда-выражение:
message = lambda: print("Информатика")
message()
Это лямбда-функция без параметров, выводящая строку «Информатика». Вызов осуществляется через переменную message. Для этой задачи можно использовать обычную функцию, но лямбда-выражения удобны для коротких и простых функций.
Lambda-выражения с параметрами
Лямбда-выражение с параметрами: параметры указываются после lambda, возвращаемое значение — после двоеточия:
message = lambda n: n**3
print(message(4)) # Выведет 64
Функция принимает параметр n и возвращает его куб. Анонимные функции могут принимать любое количество аргументов, но содержать только одно выражение. Дополнительные выражения через запятую вызовут ошибку. Запись результата лямбда-выражения в переменную (как выше) — не лучшая практика. Для многократного использования лучше создать обычную функцию с помощью def.
Практическое применение: сортировка
Лямбда-функции широко применяются, например, при сортировке. Рассмотрим сортировку списка словарей с информацией о продуктах:
products = [
{'название': 'молоко', 'цена': 340, 'количество': 2},
{'название': 'хлеб', 'цена': 98, 'количество': 94},
{'название': 'апельсин', 'цена': 20, 'количество': 56}
]
sorted_products = sorted(products, key=lambda item: item['количество'])
print(sorted_products)
Функция sorted использует лямбда-функцию в качестве ключа (key), сортируя список по значению ключа ‘количество’.
Сортировка двумерного списка
Сортировка двумерного списка:
sp = [[4, 3, 1, 2], [7, 8, 3, 2], [1, 3, 1, 4], [1, 4, 4, 4]]
sorted_sp = sorted(sp, key=lambda x: x[-1])
print(sorted_sp)
Сортировка выполняется по последнему элементу каждого вложенного списка.
Использование внутри обычных функций
Лямбда-функции можно включать в тело обычной функции:
def my_func(a):
return lambda n: a * n
double = my_func(100)
print(double(15)) # Выведет 1500
Lambda-функции и функции высшего порядка: map, filter, reduce
Лямбда-функции часто используются с функциями высшего порядка map, filter и reduce.
filter
filter фильтрует итерируемые объекты:
numbers = [2, 1, 3, 4, 7, 11, 18, 45, 765, 23, 96, 45]
filtered_numbers = list(filter(lambda x: x > 20, numbers))
print(filtered_numbers)
Код отфильтровывает числа, большие 20. Аналогичный результат можно получить с помощью генератора списков.
map
map применяет функцию к каждому элементу итерируемой последовательности:
numbers = [2, 1, 3, 4, 7, 11, 18, 45, 765, 23, 96, 45]
squared_numbers = list(map(lambda x: x**2, numbers))
print(squared_numbers)
Каждый элемент возводится в квадрат.
reduce
reduce (из модуля functools) применяет функцию к последовательности, возвращая единое значение:
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product) # Выведет 120
Вычисляется произведение элементов списка. Можно указать начальное значение для reduce.
Лямбда-выражения — мощный инструмент Python, но их следует использовать разумно. Для сложных задач предпочтительнее обычные функции (def). Однако лямбда-функции удобны для коротких, одноразовых операций.