Translate

viernes, 23 de agosto de 2019

¿Cuál es la diferencia entre un closure y una lambda?

Muchas veces he visto que closure y lambda se toman como sinonimos pero pero no lo son. Veamos cuales son las diferencias.

Una lambda es solo una función anónima, una función definida sin nombre. En algunos lenguajes, como Scheme, son equivalentes a funciones con nombre. De hecho, la definición de la función se reescribe como un enlace interno de una lambda a una variable. En otros lenguajes, como Python, hay algunas distinciones (bastante innecesarias) entre ellos, pero de lo contrario se comportan de la misma manera.

Un closure es cualquier función que se cierra sobre el entorno en el que se definió. Esto significa que puede acceder a variables que no están en su lista de parámetros. Ejemplos:

def func (): return h

def otrofunc (h):
   return func ()

Esto provocará un error, porque func no se cierra sobre el entorno en otrofunc - h no está definido. func solo cierra sobre el entorno global. Esto funcionará de esta manera :

def otrofunc (h):
    def func (): retorno h
    return func ()

Porque aquí, func se define en otrofunc.

Otro punto importante: func continuará cerrándose sobre el entorno de otrofunc incluso cuando ya no se evalúe en otrofunc. Este código también funcionará:

def anotherfunc(h):
    def func(): return h
    return func

print anotherfunc(10)()

Esto imprimirá 10.

Esto no tiene nada que ver con las lambdas: son dos conceptos diferentes (aunque relacionados).