Python для начинающих: Лямбда-функции (Урок 21)

Определение лямбда-функций

В 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). Однако лямбда-функции удобны для коротких, одноразовых операций.

Что будем искать? Например,программа