Вопрос-Ответ

Is it pythonic: naming lambdas

Это pythonic: именование лямбд

Я начинаю ценить ценность лямбда-выражений в python, особенно когда дело доходит до функционального программирования, map, функций, возвращающих функции, и т.д. Однако я также называл лямбды внутри функций, потому что:


  • Мне нужна одна и та же функциональность несколько раз, и я не хочу повторять код.

  • Функциональность специфична для функции, в которой она появляется; в другом месте она не нужна.

Когда я сталкиваюсь с ситуацией, которая соответствует вышеуказанным критериям, я пишу именованное лямбда-выражение, чтобы ограничить функциональность. Например, я пишу функцию, которая работает с некоторыми numpy массивами, и мне нужно выполнить некоторое умеренно утомительное индексирование всех массивов, передаваемых функции (которые могут легко поместиться в одной строке). Я написал именованное лямбда-выражение для выполнения индексации вместо написания целой другой функции или копирования / вставки индексации несколько раз по всему определению функции.

def fcn_operating_on_arrays(array0, array1):
indexer = lambda a0, a1, idx: a0[idx] + a1[idx]

# codecodecode

indexed = indexer(array0, array1, indices)

# codecodecode in which other arrays are created and require `indexer`

return the_answer

Это злоупотребление лямбдами python? Должен ли я просто смириться с этим и определить отдельную функцию?

Правки

Вероятно, стоит связать функцию внутри функции.

Переведено автоматически
Ответ 1

Это не Pythonic, и PEP8 препятствует этому:


Всегда используйте оператор def вместо оператора присваивания, который привязывает лямбда-выражение непосредственно к идентификатору.


ДА:


def f(x): return 2*x

НЕТ:


f = lambda x: 2*x

Первая форма означает, что имя результирующего объекта функции является
конкретным 'f' вместо общего '<lambda>'. Это больше
полезно для трассировок и строковых представлений в целом. Использование
оператора присваивания устраняет единственное преимущество, которое может предложить лямбда-выражение
по сравнению с явным оператором def (т. Е. То, что его можно
встроить в более крупное выражение)


Эмпирическое правило для этого - подумать над его определением: лямбд-выражения являются анонимными функциями. Если вы назовете его, оно больше не будет анонимным. :)

Ответ 2

Я написал именованное лямбда-выражение для выполнения индексации вместо написания совершенно другой функции


Ну, вы пишете совершенно другую функцию. Вы просто пишете ее с помощью лямбда-выражения.

Почему бы не использовать def? Вы получаете более качественные трассировки стека и большую синтаксическую гибкость, и вы ничего не теряете. Это не значит, что def не может произойти внутри другой функции.:

def fcn_operating_on_arrays(array0, array1):
def indexer(a0, a1, idx):
return a0[idx] + a1[idx]
...
python