Es pythonic: nombrando lambdas

Estoy empezando a apreciar el valor de las expresiones lambda en python, particularmente cuando se trata de progtwigción funcional, map , funciones que devuelven funciones , etc. Sin embargo, también he estado nombrando lambdas dentro de las funciones porque:

  • Necesito la misma funcionalidad varias veces y no quiero repetir el código.
  • La funcionalidad es específica a la función en la que aparece; no es necesario en otros lugares.

Cuando me encuentro con una situación que cumple con los criterios anteriores, he estado escribiendo una expresión lambda con el fin de SECAR y restringir la funcionalidad del scope. Por ejemplo, estoy escribiendo una función que opera en algunas matrices numpy , y necesito hacer una indexación moderadamente tediosa de todas las matrices pasadas a la función (que pueden caber fácilmente en una sola línea). He escrito una expresión lambda con el nombre para hacer la indexación en lugar de escribir una función completamente diferente o copiar / pegar la indexación varias veces a lo largo de la definición de la función.

 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 

¿Es esto un abuso de las lambdas de python? ¿Debería simplemente aspirarlo y definir una función separada?

Ediciones

Probablemente vale la pena vincular la función dentro de la función .

Esto no es Pythonic y PEP8 lo desalienta :

Siempre use una instrucción def en lugar de una instrucción de asignación que vincule una expresión lambda directamente a un identificador.

Sí:

 def f(x): return 2*x 

No:

 f = lambda x: 2*x 

La primera forma significa que el nombre del objeto de función resultante es específicamente 'f' lugar del genérico '' . Esto es más útil para las trazas y representaciones de cadenas en general. El uso de la instrucción de asignación elimina el único beneficio que puede ofrecer una expresión lambda sobre una statement de definición explícita (es decir, que se puede incrustar dentro de una expresión más grande)

Una regla de oro para esto es pensar en su definición : las expresiones lambdas son funciones anónimas. Si lo nombras, ya no es anónimo. 🙂

He escrito una expresión lambda para hacer la indexación en lugar de escribir una función completamente diferente

Bueno, estás escribiendo una función completamente diferente. Solo lo estás escribiendo con una expresión lambda.

¿Por qué no usar def ? Obtiene mejores trazas de stack y más flexibilidad sintáctica, y no pierde nada. No es que def no pueda ocurrir dentro de otra función:

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

Estos son funcionalmente (sin juego de palabras) idénticos.

 indexer = lambda a0, a1, idx: a0[idx] + a1[idx] def indexer(a0, a1, idx): return a0[idx] + a1[idx] 

Si tiene una preferencia estética por una u otra, entonces úsela.