Функции в Python являются первоклассными гражданами языка. Это означает, что функцией можно манипулировать так, как если бы она была значением данных. Таким образом, функция может быть передана другой функции в качестве аргумента или возвращена из функции в результате. Это называется программирование высшего порядка .
Теперь ключевые слова def
и lambda
определяют такие значения функции. Основное отличие состоит в том, что def
присваивает имя такой функции, тогда как лямбда-выражения являются анонимными функциями. Другое отличие состоит в том, что лямбды ограничены одной строкой кода (хотя есть языки, где это не так).
Например, здесь представлены две эквивалентные функции, одна из которых определена с помощью def
, а другая с помощьюlambda
:
def say_hello(name):
print('Hi ', name)
lambda name: print('Hi ', name)
Другой способ интерпретации ключевого слова def
заключается в следующем:
say_hello = lambda name: print('Hi ', name)
Хотя такой код крайне не рекомендуется.
По сутиобе эти функции являются (почти) эквивалентными значениями данных, но в приведенном выше фрагменте можно вызывать функцию, определенную с помощью def
, так как она имеет имя и, следовательно, мы можем получить к нему доступ позже. Тот, который определен lambda
, не может, так как у него нет имени, и поэтому он сразу же теряется, если не назначается переменной или не передается другой функции, скажем f
, в качестве аргумента, где ему затем присваивается имяв локальной области видимости f
в соответствии с параметрами f
.
Однако лямбды полезны в тех случаях, когда мы не хотим загромождать нашу область видимости новыми короткими функциями, которые передаются толькодля другой функции в качестве аргумента:
map(lambda x: x * 2, [1, 2, 3])
# >>> [2, 4, 6]
Если у вас уже есть функция, определенная с def
, которая выполняет умножение, показанное выше, как было бы в вашем примере, например:
def double(x):
return x * 2
Тогда вы можете просто обратиться к этой функции по имени в вызове карты:
map(double, [1, 2, 3])
# >>> [2, 4, 6]
Вкратце: нет необходимости "компилировать функцию в лямбду",Лямбда - это особый случай функции, которой не дано имя. Вместо этого обращайтесь к своей функции по имени.
PS: не используйте map
и filter
, вместо этого используйте список пониманий , так как они считаются более питоническими.