2009-10-18 8 views

Respuesta

32

Lambda, que se originó a partir Lambda Calculus y (que yo sepa) se puso en práctica por primera vez en Lisp, es básicamente una función anónima - una función que no tiene un nombre, y se utiliza en línea, en otras palabras, se puede asignar una identificador para una función lambda en una sola expresión como tal:

>>> addTwo = lambda x: x+2 
>>> addTwo(2) 
4 

Esto asigna addTwo a la función anónima, que acepta 1 argumento x, y en el cuerpo de la función que añade 2 a x, devuelve el último valor de la última expresión en el cuerpo de la función, por lo que no hay palabra clave return.

El código anterior es más o menos equivalente a:

>>> def addTwo(x): 
...  return x+2 
... 
>>> addTwo(2) 
4 

A menos que usted no está utilizando una definición de función, que está asignando un identificador a la lambda.

El mejor lugar para usarlos es cuando usted realmente no desea definir una función con un nombre, posiblemente debido a que la función sólo será utilizada una vez y no en numerosas ocasiones, en cuyo caso sería mejor apagado con una definición de función.

ejemplo de un árbol de hash usando lambdas:

>>> mapTree = { 
...  'number': lambda x: x**x, 
...  'string': lambda x: x[1:] 
... } 
>>> otype = 'number' 
>>> mapTree[otype](2) 
4 
>>> otype = 'string' 
>>> mapTree[otype]('foo') 
'oo' 

En este ejemplo yo realmente no quiero definir un nombre a cualquiera de estas funciones, porque sólo voy a ser utilizados dentro del hachís, por lo tanto, Usaremos lambdas.

+0

Solo un pequeño y minúsculo detalle en una respuesta que de otro modo sería genial: lambda no es original de Lisp, sino más bien de cálculo lambda. – phoebus

+0

ah sí, mi error al utilizar originé - Hice algunas ediciones. ¿Algo más debería agregar/modificar? –

+0

+1 Maravillosa respuesta, considere cambiar el nombre 'type' en el ejemplo dict .. ya que es un built-in ... –

3

No sé qué libro está utilizando, pero Dive into Python has a section que creo que es informativo.

+0

¡En 2017, no hay sitio web diveintopython.org en ninguna parte de la World Wide Web! – Rexford

3

El uso de lambda es una especie de estilo. Cuando puede salirse con la suya con una función muy simple, y generalmente donde simplemente la almacena en algún lugar (en una lista de funciones tal vez, o en una estructura de datos del juego de herramientas GUI, etc.) las personas sienten que lambda reduce el desorden en su código.

En Python solo es posible crear una lambda que devuelva una sola expresión, y la lambda no puede abarcar varias líneas (a menos que una las múltiples líneas mediante la barra diagonal inversa al final de una línea) truco). La gente ha solicitado que Python agregue mejoras para lambda, pero no ha sucedido. Según entiendo, los cambios para hacer que lambda pueda escribir cualquier función complicaría significativamente el código de análisis en Python. Y, como ya tenemos def para definir una función, la ganancia no se considera que valga la pena. Por lo tanto, hay algunos casos en los que es posible que desee utilizar lambda cuando no sea posible. En ese caso, sólo puede utilizar una def:

object1.register_callback_function(lambda x: x.foo() > 3) 

def fn(x): 
    if x.foo() > 3: 
     x.recalibrate() 
     return x.value() > 9 
    elif x.bar() > 3: 
     x.do_something_else() 
     return x.other_value < 0 
    else: 
     x.whatever() 
     return True 

object2.register_callback_function(fn) 
del(fn) 

La primera función de devolución de llamada era simple y una lambda suficiente. Para el segundo, simplemente no es posible usar una lambda. Logramos el mismo efecto al usar def y crear un objeto de función vinculado al nombre fn, y luego pasar fn a register_callback_function(). Entonces, solo para mostrar que podemos, llamamos al del() con el nombre fn para desvincularlo. Ahora el nombre fn ya no está vinculado a ningún objeto, pero register_callback_function() todavía tiene una referencia al objeto de función para que el objeto de función permanezca activo.

Cuestiones relacionadas