Las lambdas son en realidad construcciones muy poderosas que surgen de ideas en programación funcional, y es algo que de ninguna manera será fácilmente revisado, redefinido o eliminado en el futuro cercano de Python. Le ayudan a escribir código que es más poderoso ya que le permite pasar funciones como parámetros, de ahí la idea de funciones como ciudadanos de primera clase.
Las lambdas tienden a ser confusas, pero una vez que se obtiene una comprensión sólida, puede escribir código elegante y limpio como este:
squared = map(lambda x: x*x, [1, 2, 3, 4, 5])
La línea de código anterior devuelve una lista de los cuadrados de los números en la lista. Por supuesto, también puedes hacerlo como:
def square(x):
return x*x
squared = map(square, [1, 2, 3, 4, 5])
Es obvio que el código anterior es más corto, y esto es especialmente cierto si tiene la intención de utilizar la función de mapa (o cualquier función similar que tome una función como parámetro) en un solo lugar. Esto también hace que el código sea más intuitivo y elegante.
Además, como @David Zaslavsky mencionó en su respuesta, las comprensiones de listas no siempre son el camino a seguir, especialmente si su lista tiene que obtener valores de alguna forma matemática oscura.
Desde un punto de vista más práctico, una de las mayores ventajas de lambdas para mí recientemente ha sido la GUI y la programación basada en eventos. Si observa las devoluciones de llamada en Tkinter, todo lo que toman como argumentos es el evento que los activó. P.ej
def define_bindings(widget):
widget.bind("<Button-1>", do-something-cool)
def do-something-cool(event):
#Your code to execute on the event trigger
¿Y si tuvieras que pasar algunos argumentos? Algo tan simple como pasar 2 argumentos para almacenar las coordenadas de un clic del mouse. Puedes hacerlo fácilmente así:
def main():
# define widgets and other imp stuff
x, y = None, None
widget.bind("<Button-1>", lambda event: do-something-cool(x, y))
def do-something-cool(event, x, y):
x = event.x
y = event.y
#Do other cool stuff
Ahora puede argumentar que esto se puede hacer usando variables globales, pero ¿realmente quiere golpearse la cabeza preocupándose por la gestión de la memoria y las fugas, especialmente si la variable global solo se usará en un lugar en particular? Eso sería un mal estilo de programación.
En resumen, las lambdas son increíbles y nunca deben subestimarse. Sin embargo, las lambdas de Python no son lo mismo que las lambdas de LISP (que son más poderosas), pero realmente puedes hacer muchas cosas mágicas con ellas.