На этом шаге мы рассмотрим, где применяются лямбды.
В каких случаях в программном коде следует применять лямбда-функции? Технически вы можете применять лямбда-выражение в любой ситуации, когда от вас ожидается, что вы предоставите объект-функцию. И поскольку лямбды могут быть анонимными, перед этим вам даже не нужно назначать им имя.
Этот факт обеспечивает удобную и "небюрократическую" краткую форму для определения функции в Python. Наш самый частый вариант применения лямбд состоит в написании кратких и сжатых функций для сортировки итерируемых объектов по альтернативному ключу:
>>> tuples = [(1, 'd'), (2, 'b'), (4, 'a'), (3, 'c')] >>> sorted(tuples, key=lambda x: x[1]) [(4, 'a'), (2, 'b'), (3, 'c'), (1, 'd')]
В приведенном выше примере мы сортируем список кортежей по второму значению в каждом кортеже. В этом случае лямбда-функция обеспечивает быстрый способ изменить порядок сортировки. Ниже приведен еще один пример сортировки, с которым вы можете поиграть:
>>> sorted(range(-5, 6), key=lambda x: x * x) [0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5]
Оба показанных примера имеют в Python более сжатые реализации с использованием встроенных функций operator.itemgetter() и abs().
Но, надеюсь, вы заметили, как применение лямбды обеспечивает вам гораздо большую гибкость. Хотите отсортировать последовательность по некоему произвольно вычисленному ключу? Без проблем. Теперь вы знаете, как это сделать.
Вот еще одна интересная вещь о лямбдах: как и обычные вложенные функции, лямбды работают также и как лексические замыкания.
Что такое лексическое замыкание? Это лишь затейливое название для функции, которая помнит значения из объемлющего лексического контекста, даже когда поток управления программы больше не находится в этом контексте. Вот (довольно академичный) пример, который иллюстрирует эту идею:
>>> def make_adder(n): return lambda x: x + n >>> plus_3 = make_adder(3) >>> plus_5 = make_adder(5) >>> plus_3(4) 7 >>> plus_5(4) 9
В приведенном выше примере лямбда x + n по-прежнему может получать доступ к значению n, несмотря на то что она была определена в функции make_adder() (объемлющем контексте).
Иногда применение лямбда-функции вместо вложенной функции, объявленной при помощи ключевого слова def, может яснее выражать намерение программиста. Но, честно говоря, это случается редко. Поэтому давайте поговорим об этом подробнее.
На следующем шаге мы рассмотрим особенности применения лямбд.