Лямбда - це насправді дуже потужні конструкції, що випливають із ідей функціонального програмування, і це - те, що аж ніяк не буде легко переглянуто, переосмислено або видалено найближчим часом Python. Вони допомагають вам написати код, який є більш потужним, оскільки він дозволяє передавати функції як параметри, таким чином, уявлення про функції як першокласні громадяни.
Лямбди, як правило, стають заплутаними, але після того, як буде отримано чітке розуміння, ви можете написати чистий елегантний код на зразок цього:
squared = map(lambda x: x*x, [1, 2, 3, 4, 5])
Вищевказаний рядок коду повертає список квадратів чисел у списку. Звичайно, ви також можете це зробити так:
def square(x):
return x*x
squared = map(square, [1, 2, 3, 4, 5])
Очевидно, що колишній код коротший, і це особливо вірно, якщо ви маєте намір використовувати функцію map (або будь-яку подібну функцію, яка приймає функцію як параметр) лише в одному місці. Це також робить код більш інтуїтивним та елегантним.
Крім того, як згадував @David Заславський у своїй відповіді, розуміння списку - це не завжди шлях, особливо якщо ваш список повинен отримати значення якимось незрозумілим математичним шляхом.
З більш практичної точки зору, одна з найбільших переваг лямбдаз для мене останнім часом була в графічному інтерфейсі та керованому подіями програмуванні. Якщо ви подивитеся на зворотні дзвінки в Tkinter, все вони сприймають як аргументи - це подія, яка їх викликала. Напр
def define_bindings(widget):
widget.bind("<Button-1>", do-something-cool)
def do-something-cool(event):
#Your code to execute on the event trigger
А що робити, якщо у вас були аргументи? Щось таке просто, як передача 2 аргументів для збереження координат клацання мишею. Ви можете легко зробити так:
def main():
# define widgets and other imp stuff
x, y = None, None
widget.bind("<Button-1>", lambda event: do-something-cool(x, y))
def do-something-cool(event, x, y):
x = event.x
y = event.y
#Do other cool stuff
Тепер ви можете стверджувати, що це можна зробити за допомогою глобальних змінних, але чи справді ви хочете замахнутися на голову, турбуючись про управління пам’яттю та витоку, особливо якщо глобальна змінна буде просто використана в одному конкретному місці? Це був би просто поганий стиль програмування.
Коротше кажучи, лямбди є приголомшливими і їх ніколи не можна недооцінювати. Лямбди Python - це не те саме, що лямбди LISP (які є більш потужними), але ви дійсно можете зробити з ними багато магічних речей.