Я начинаю ценить ценность лямбда-выражений в python, особенно когда дело доходит до функционального программирования, map, функций, возвращающих функции, и т.д. Однако я также называл лямбды внутри функций, потому что:
Мне нужна одна и та же функциональность несколько раз, и я не хочу повторять код.
Функциональность специфична для функции, в которой она появляется; в другом месте она не нужна.
Когда я сталкиваюсь с ситуацией, которая соответствует вышеуказанным критериям, я пишу именованное лямбда-выражение, чтобы ограничить функциональность. Например, я пишу функцию, которая работает с некоторыми numpy массивами, и мне нужно выполнить некоторое умеренно утомительное индексирование всех массивов, передаваемых функции (которые могут легко поместиться в одной строке). Я написал именованное лямбда-выражение для выполнения индексации вместо написания целой другой функции или копирования / вставки индексации несколько раз по всему определению функции.
Всегда используйте оператор def вместо оператора присваивания, который привязывает лямбда-выражение непосредственно к идентификатору.
ДА:
deff(x): return2*x
НЕТ:
f = lambda x: 2*x
Первая форма означает, что имя результирующего объекта функции является конкретным 'f' вместо общего '<lambda>'. Это больше полезно для трассировок и строковых представлений в целом. Использование оператора присваивания устраняет единственное преимущество, которое может предложить лямбда-выражение по сравнению с явным оператором def (т. Е. То, что его можно встроить в более крупное выражение)
Эмпирическое правило для этого - подумать над его определением: лямбд-выражения являются анонимными функциями. Если вы назовете его, оно больше не будет анонимным. :)
Ответ 2
Я написал именованное лямбда-выражение для выполнения индексации вместо написания совершенно другой функции
Ну, вы пишете совершенно другую функцию. Вы просто пишете ее с помощью лямбда-выражения.
Почему бы не использовать def? Вы получаете более качественные трассировки стека и большую синтаксическую гибкость, и вы ничего не теряете. Это не значит, что def не может произойти внутри другой функции.: