Лямбда-функции в Python: когда их использовать, а когда нет
Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе
Представьте, что вам нужно оставить кому-то короткую записку: «Вернусь через 5 минут». Вы не станете писать официальное письмо с приветствием, тремя абзацами и подписью. Вы черкнёте пару слов на стикере, и готово.
Лямбда-функции и есть стикеры Python. Это крошечные анонимные одноразовые функции на случай, когда нужна короткая функция в одну строку, а полноценный блок def был бы излишеством.
В этом уроке вы научитесь писать лямбда-функции, узнаете, где они особенно хороши (сортировка, фильтрация, преобразование элементов), и, что не менее важно, когда от них лучше отказаться в пользу обычной функции.
Как написать лямбда-функцию
Лямбда-функцию создают с помощью ключевого слова lambda, за которым идут параметры, двоеточие и одно выражение. Значение этого выражения возвращается автоматически, ключевое слово return не нужно.
10 10
Синтаксис такой: lambda parameters: expression. У функции нет имени (поэтому такие функции и называют «анонимными»), нет def, нет return и нет тела из нескольких строк. Только одно выражение, которое вычисляется и возвращается.
Лямбды могут принимать несколько параметров, как и обычные функции:
10 Ada Lovelace
Лямбда-функции в sorted()
Чаще всего лямбда-функции используют как аргумент key в sorted(). Параметр key сообщает Python, что перед сравнением каждый элемент нужно преобразовать этой функцией.
['Bob', 'Charlie', 'alice'] ['alice', 'Bob', 'Charlie']
Лямбда lambda name: name.lower() велит sorted() сравнивать версии строк в нижнем регистре. Сами строки остаются прежними: лямбда влияет только на сравнение.
Лямбды особенно полезны для сортировки сложных данных, например списков кортежей или словарей:
Charlie: 72 Alice: 88 Diana: 91 Bob: 95
Mouse: $25 Keyboard: $75 Laptop: $999
Лямбда-функции в map() и filter()
map() применяет функцию к каждому элементу списка и возвращает преобразованные результаты. filter() оставляет только те элементы, для которых функция возвращает True. Обе принимают функцию первым аргументом, и это идеальное место для лямбды.
[2, 4, 6, 8, 10] [2, 4]
Мы оборачиваем map() и filter() в list(), потому что они возвращают ленивые итераторы, а не списки. Вызов list() заставляет их выдать все результаты сразу.
А вот пример ближе к практике, в нём мы извлекаем и фильтруем данные:
[11.55, 26.39, 5.5, 49.5, 14.03] [23.99, 45.0]
doubled = list(map(
lambda x: x * 2, numbers
))
evens = list(filter(
lambda x: x % 2 == 0, numbers
))doubled = [x * 2 for x in numbers]
evens = [x for x in numbers
if x % 2 == 0]lambda или def: когда что использовать
Лямбды соблазнительны: они кажутся изящными и компактными. Но у них есть реальные ограничения. Вот когда что использовать:
Используйте lambda, когда:
key=, map() или filter()Используйте `def`, когда:
if/else, циклы или обработка ошибок['apple', 'banana', 'cherry'] ['apple', 'banana', 'cherry']
Частые приёмы с лямбдами
Вот несколько приёмов, которые встречаются в реальном коде на Python. Если вы научитесь их узнавать, вам будет проще читать чужой код и понимать, когда лямбда подходит для задачи.
Alex: 30 Zara: 22
even odd
awesome is
Практические упражнения
Что выведет этот код? Впишите вывод в точности.
operation = lambda a, b: a * b + 1
print(operation(3, 4))
print(operation(0, 10))Дан список слов. С помощью sorted() и лямбды отсортируйте их по последнему символу. Выведите получившийся отсортированный список.
Используйте этот список: words = ['hello', 'world', 'python', 'code']
Ожидаемый вывод: ['world', 'code', 'python', 'hello']
Дан список чисел. С помощью filter() и лямбды оставьте только числа больше 10, затем с помощью map() и лямбды возведите каждое оставшееся число в квадрат. Выведите итоговый список.
Используйте этот список: numbers = [3, 15, 7, 20, 8, 12]
Ожидаемый вывод: [225, 400, 144]
Дан список кортежей (name, gpa) с данными учеников. Отсортируйте их по среднему баллу (GPA) от самого высокого к самому низкому с помощью sorted() и лямбды. Выведите каждого ученика на отдельной строке в формате name: gpa.
Используйте этот список:
students = [('Alice', 3.5), ('Bob', 3.9), ('Charlie', 3.2), ('Diana', 3.7)]Ожидаемый вывод:
Bob: 3.9
Diana: 3.7
Alice: 3.5
Charlie: 3.2Дан список слов. С помощью sorted() и лямбды отсортируйте их по длине (сначала самые короткие). Если у двух слов одинаковая длина, они должны идти в алфавитном порядке. Выведите отсортированный список.
Используйте этот список: words = ['fig', 'apple', 'date', 'kiwi', 'banana', 'pear', 'plum']
Ожидаемый вывод: ['fig', 'date', 'kiwi', 'pear', 'plum', 'apple', 'banana']