¿Por qué utilizar lambda?
En términos generales, las lambdas son útiles como una especie de abreviatura de función que le permite incrustar la definición de una función dentro del código que la usa. Son completamente opcionales (siempre puede usar defs en su lugar), pero tienden a ser construcciones de codificación más simples
en escenarios donde solo necesita incrustar pequeños fragmentos de código ejecutable.
Las lambdas también se usan comúnmente para codificar tablas de salto, que son listas o diccionarios de acciones que se realizarán bajo demanda. Por ejemplo:
L = [lambda x: x ** 2, # Inline function definition
lambda x: x ** 3,
lambda x: x ** 4] # A list of 3 callable functions
for f in L:
print(f(2)) # Prints 4, 8, 16print(L[0](3)) # Prints 9
La expresión lambda es más útil como forma abreviada de def, cuando necesita introducir pequeños fragmentos de código ejecutable en lugares donde las declaraciones son ilegales sintácticamente.
Este fragmento de código, por ejemplo, crea una lista de tres funciones incrustando expresiones lambda dentro de una lista literal; una definición no funcionará dentro de una lista literal como esta porque es una declaración, no una expresión. La codificación def equivalente requeriría nombres de funciones temporales y definiciones de funciones fuera del contexto de uso previsto:
deff1(x):returnx ** 2
deff2(x):returnx ** 3 # Define named functions
deff3(x):returnx ** 4
L = [f1, f2, f3] # Reference by name
for f in L:
print(f(2)) # Prints 4, 8, 16
print(L[0](3)) # Prints 9
De hecho, puede hacer el mismo tipo de cosas con diccionarios y otras estructuras de datos en Python para crear tipos más generales de tablas de acciones. Aquí hay otro ejemplo para
ilustrar, en el indicador interactivo:
>>> key = 'got'
>>> {'already': (lambda: 2 + 2),
... 'got': (lambda: 2 * 4),
... 'one': (lambda: 2 ** 6)}[key]()
8
Aquí, cuando Python crea el diccionario temporal, cada una de las lambdas anidadas genera y deja una función que se llamará más tarde. La indexación por clave recupera una de esas funciones, y los paréntesis obligan a llamar a la función obtenida. Cuando codificamos de esta manera, un diccionario se convierte en una herramienta de ramificación de múltiples vías.
Para que esto funcione sin lambda, necesitaría codificar tres declaraciones def en algún otro lugar de su archivo, fuera del diccionario en el que se usarán las funciones, y hacer referencia a las funciones por su nombre:
>>> deff1():return2 + 2
...
>>> deff2():return2 * 4
...
>>> deff3():return2 ** 6
...
>>> key = 'one'>>> {'already': f1, 'got': f2, 'one': f3}[key]()
64
Esto también funciona, pero sus defs pueden estar arbitrariamente lejos en su archivo, incluso si son solo pequeños fragmentos de código. La proximidad del código que proporcionan las lambdas es especialmente útil para funciones que solo se usarán en un contexto único, si las tres funciones aquí no están
útil en cualquier otro lugar, tiene sentido incrustar sus definiciones en el diccionario como lambdas. Además, la forma def requiere que invente nombres para estos pequeños
funciones que pueden chocar con otros nombres en este archivo (quizás poco probable, pero siempre posible).
Las lambdas también son útiles en las listas de argumentos de llamadas a funciones como una forma de incorporar definiciones de funciones temporales que no se utilizan en ningún otro lugar de su programa; veremos algunos ejemplos de esos otros usos más adelante en este capítulo, cuando estudiemos el mapa.
Si quieren saber mas les recomiendo leer el capitulo 19 Advanced Function Topics de este libro