Pregunta ¿Por qué Python lambdas es útil? [cerrado]


Estoy tratando de descubrir Python lambdas. ¿Es Lambda uno de esos elementos de lenguaje "interesantes" que en la vida real deberían olvidarse?

Estoy seguro de que hay algunos casos límite en los que podría ser necesario, pero dada la oscuridad de la misma, el potencial de redefinición en futuras versiones (mi suposición basada en las diversas definiciones de la misma) y la claridad de codificación reducida - si ser evitado?

Esto me recuerda el desbordamiento (desbordamiento de búfer) de los tipos C, apuntando a la variable superior y sobrecarga para establecer los otros valores de campo. Se siente como una especie de espectáculo techie pero pesadilla codificador de mantenimiento.


813
2018-05-20 20:40


origen


Respuestas:


Estás hablando de funciones lambda? Me gusta

lambda x: x**2 + 2*x - 5

Esas cosas son 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])

conjuntos mult3 a [3, 6, 9], esos elementos de la lista original que son múltiplos de 3. Esto es más corto (y, podría decirse, 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ía hacer lo mismo que una lista de 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 usar una lista de comprensión y una función lambda puede ser la manera más corta de escribir algo.

  • Devolver una función desde otra función

    >>> def transform(n):
    ...     return lambda x: x + n
    ...
    >>> f = transform(3)
    >>> f(4)
    7
    

    Esto se usa a menudo para crear envoltorios 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'
    
  • Ordenando por una tecla 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]
    

Yo uso las funciones lambda regularmente. Me tomó un tiempo acostumbrarme a ellos, pero finalmente llegué a comprender que son una parte muy valiosa del lenguaje.


892
2018-05-20 20:52



lambda es solo una forma elegante de decir function. Aparte de su nombre, no hay nada oscuro, intimidante o críptico al respecto. Cuando lea la siguiente línea, reemplace 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, dilo explícitamente

> f = function(x) { x + 1 }
> f(3)
4

¿Lo ves? Es una de las cosas más naturales para hacer en programación.


322
2018-01-16 15:03



El resumen de dos líneas:

  1. Cierres: Muy útil. Aprenderlos, usarlos, amarlos.
  2. Python lambda palabra clave: innecesario, ocasionalmente útil. Si te encuentras haciendo algo remotamente complejo con él, guárdalo y define una función real.

93
2018-05-20 22:37



Una lambda es parte de un mecanismo de abstracción muy importante que trata con funciones de orden superior. Para obtener una comprensión adecuada de su valor, mire lecciones de alta calidad de Abelson y Sussmany lee el libro SICP

Estos son temas relevantes en el negocio de software moderno y cada vez son más populares.


71
2018-05-20 20:49



Dudo que lambda se vaya. Ver La publicación de Guido sobre finalmente dejar de tratar de eliminarlo. Ver también un esbozo del conflicto.

Puede consultar esta publicación para obtener más información sobre el acuerdo detrás de las características funcionales de Python: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

Curiosamente, el mapa, el filtro y las funciones de reducción que originalmente motivaron la introducción de lambda y otras características funcionales han sido reemplazadas en gran medida por listas de comprensión y expresiones de generador. De hecho, la función de reducción se eliminó de la lista de funciones integradas en Python 3.0. (Sin embargo, no es necesario enviar quejas sobre la eliminación de lambda, mapa o filtro: se quedan. :-)

Mis propios dos centavos: Rara vez vale la pena vale la pena hasta donde llega la claridad. En general, hay una solución más clara que no incluye lambda.


57
2018-05-20 20:46



Las lambdas son extremadamente útiles en la programación de GUI. Por ejemplo, digamos que está creando un grupo de botones y desea utilizar una única devolución de llamada paramaterial en lugar de una devolución de llamada única por botón. Lambda te permite lograr eso con facilidad:

for value in ["one","two","three"]:
    b = tk.Button(label=value, command=lambda arg=value: my_callback(arg))
    b.pack()

(Nota: aunque esta pregunta es específicamente sobre lambda, también puedes usar functools.partial para obtener el mismo tipo de resultado)

La alternativa es crear una devolución de llamada separada para cada botón que puede generar código duplicado.


56
2018-04-24 16:48



En Python, lambda es solo una forma de definir funciones en línea,

a = lambda x: x + 1
print a(1)

y..

def a(x): return x + 1
print a(1)

..es el exacto mismo.

No hay nada que puedas hacer con lambda que no puedas hacer con una función regular: en Python, las funciones son un objeto como cualquier otra cosa, y las lambdas simplemente definen una función:

>>> a = lambda x: x + 1
>>> type(a)
<type 'function'>

Honestamente creo que lambda la palabra clave es redundante en Python; nunca he tenido la necesidad de usarlas (o he visto una que se usó para usar mejor una función normal, una lista de comprensión o una de las muchas funciones integradas)

Para un ejemplo completamente al azar, del artículo "¡La lambda de Python está rota!":

Para ver cómo se rompe lambda, intente generar una lista de funciones fs=[f0,...,f9] dónde fi(n)=i+n. Primer intento:

>>> fs = [(lambda n: i + n) for i in range(10)]
>>> fs[3](4)
13

Yo diría que, incluso si eso funcionó, es horrible y "antipático", la misma funcionalidad podría escribirse de muchas otras maneras, por ejemplo:

>>> n = 4
>>> [i + n for i in range(10)]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

Sí, no es lo mismo, pero tengo Nunca visto una causa donde se ha requerido generar un grupo de funciones lambda en una lista. Puede tener sentido en otros idiomas, pero Python no es Haskell (o Lisp, o ...)

Tenga en cuenta que podemos utilizar lambda y aún así lograr el deseado   resultados de esta manera:

>>> fs = [(lambda n,i=i: i + n) for i in range(10)]
>>> fs[3](4)
7

Editar:

Hay algunos casos en los que lambda es útil, por ejemplo, a menudo es conveniente cuando se conectan señales en aplicaciones PyQt, como esta:

w = PyQt4.QtGui.QLineEdit()
w.textChanged.connect(lambda event: dothing())

Solo haciendo w.textChanged.connect(dothing) llamaría al dothing método con un extra event argumento y causar un error. El uso de lambda significa que podemos ordenar el argumento sin tener que definir una función de ajuste.


31
2018-05-21 02:03