¿Para qué son útiles las lambdas? [cerrado]
Estoy intentando descubrir las lambdas de Python. ¿Es lambda
uno de esos elementos lingüísticos "interesantes" que en la vida real deberían olvidarse?
Estoy seguro de que hay algunos casos extremos en los que podría ser necesario, pero dada su oscuridad, la posibilidad de que se redefina en futuras versiones (mi suposición se basa en las diversas definiciones) y la claridad de codificación reducida, ¿debería ser así? ¿Se debe evitar?
Esto me recuerda al desbordamiento (desbordamiento del búfer) de los tipos C: apuntar a la variable superior y sobrecargar para establecer los otros valores de campo. Se siente como una especie de espectáculo tecnológico pero una pesadilla para el codificador de mantenimiento.
¿ Estás hablando de expresiones lambda ? Como
lambda x: x**2 + 2*x - 5
Esas cosas son realmente bastante útiles. Python admite un estilo de programación llamado programación funcional donde puedes pasar funciones a otras funciones para hacer cosas. Ejemplo:
mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])
establece mult3
en [3, 6, 9]
, aquellos elementos de la lista original que son múltiplos de 3. Esto es más corto (y, se podría argumentar, más claro) que
def filterfunc(x):
return x % 3 == 0
mult3 = filter(filterfunc, [1, 2, 3, 4, 5, 6, 7, 8, 9])
Por supuesto, en este caso particular, podrías hacer lo mismo que una lista por comprensión:
mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]
(o incluso como range(3,10,3)
), pero hay muchos otros casos de uso más sofisticados en los que no se puede utilizar una lista de comprensión y una función lambda puede ser la forma más corta de escribir algo.
Devolver una función de otra función
>>> def transform(n): ... return lambda x: x + n ... >>> f = transform(3) >>> f(4) 7
Esto se usa a menudo para crear contenedores de funciones, como los decoradores de Python.
Combinando elementos de una secuencia iterable con
reduce()
>>> reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9]) '1, 2, 3, 4, 5, 6, 7, 8, 9'
Ordenar por una clave alternativa
>>> sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x)) [5, 4, 6, 3, 7, 2, 8, 1, 9]
Utilizo funciones lambda con regularidad. Me tomó un tiempo acostumbrarme a ellos, pero finalmente llegué a comprender que son una parte muy valiosa del idioma.
lambda
es sólo una forma elegante de decir function
. Aparte de su nombre, no hay nada oscuro, intimidante o críptico en él. Cuando leas la siguiente línea, reemplázala lambda
por function
en tu mente:
>>> f = lambda x: x + 1
>>> f(3)
4
Simplemente define una función de x
. Algunos otros idiomas, como R
, lo dicen explícitamente:
> f = function(x) { x + 1 }
> f(3)
4
¿Verás? Es una de las cosas más naturales que se pueden hacer en programación.