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 extremos en los que podría ser necesario, pero dada la oscuridad del mismo, el potencial de que se redefina en futuras versiones (mi suposición se basa en las diversas definiciones) y la claridad de codificación reducida, en caso de que sea necesario. ser evitado?
Esto me recuerda el desbordamiento (desbordamiento del búfer) de los tipos C, apuntando a la variable superior y sobrecargando para establecer los otros valores de campo. Se siente como una especie de espectáculo técnico pero pesadilla de codificador de mantenimiento.
Respuestas:
¿Estás hablando de funciones lambda ? Me gusta
Esas cosas son realmente bastante útiles. Python admite un estilo de programación llamado programación funcional donde puede pasar funciones a otras funciones para hacer cosas. Ejemplo:
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) quePor supuesto, en este caso particular, podría hacer lo mismo que una lista de comprensión:
(o incluso como
range(3,10,3)
), pero hay muchos otros casos de uso más sofisticados en los que no puede utilizar una comprensión de lista y una función lambda puede ser la forma más corta de escribir algo.Devolver una función de otra función
Esto se usa a menudo para crear envoltorios de funciones, como los decoradores de Python.
Combinando elementos de una secuencia iterable con
reduce()
Ordenar por una tecla alternativa
Yo uso las funciones lambda de forma regular. Me tomó un tiempo acostumbrarme a ellos, pero finalmente llegué a comprender que son una parte muy valiosa del lenguaje.
fuente
','.join(str(x) for x in [1,2,3,4,5,6,7,8,9])
lambda
funciones pueden ser anónimas (como lo son en todos sus ejemplos). Si está asignando unalambda
función a algo, lo está haciendo mal y debería usarlodef
en su lugarlambda
es solo una forma elegante de decirfunction
. Aparte de su nombre, no hay nada oscuro, intimidante o críptico al respecto. Cuando se lee la siguiente línea, sustituirlambda
porfunction
en su mente:Simplemente define una función de
x
. Algunos otros idiomas, comoR
, lo dicen explícitamente:¿Lo ves? Es una de las cosas más naturales que hacer en la programación.
fuente
lambda
muy simple de entender. ¡Gracias!lambda
porfunction
en su mente y agregarreturn
antes de la última expresióntype(lambda x: 3)
.lambda
tanto las expresiones como lasdef
declaraciones generanfunction
objetos; es solo la sintaxis de unalambda
expresión la que limita las instancias que puede producir.lambda
expresión no significa que el resultado de unalambda
expresión no sea una función.El resumen de dos líneas:
lambda
clave de Python : innecesaria, ocasionalmente útil. Si te encuentras haciendo algo remotamente complejo con él, guárdalo y define una función real.fuente
Una lambda es parte de un mecanismo de abstracción muy importante que se ocupa de funciones de orden superior. Para obtener una comprensión adecuada de su valor, vea las lecciones de alta calidad de Abelson y Sussman , y lea el libro SICP
Estos son problemas relevantes en el negocio de software moderno, y se están volviendo cada vez más populares.
fuente
lambda
sy funciones de primera clase. Python tiene unalambda
declaración extremadamente limitada , pero funciones completamente de primera clase. La única diferencia que hace es que debe nombrar las funciones que desea transmitir.Las lambdas son extremadamente útiles en la programación de la GUI. Por ejemplo, supongamos que está creando un grupo de botones y desea utilizar una única devolución de llamada paramaterizada en lugar de una devolución de llamada única por botón. Lambda te permite lograr eso con facilidad:
(Nota: aunque esta pregunta se refiere específicamente
lambda
, también puede 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 conducir a un código duplicado.
fuente
value
se define en un bucle; en el otro ejemplo, el parámetro siempre solo tenía un valor. Cuando agrega algo comoarg=value
, está adjuntando el valor actual a la devolución de llamada. Sin ella, se vincula una referencia a la variable en la devolución de llamada. La referencia siempre contendrá el valor final de la variable, ya que la devolución de llamada ocurre algún tiempo después de que el ciclo ya haya terminado de ejecutarse.functools.partial()
que le permite hacer esto con menos cruft (y sinlambda
).partial(my_callback, value)
vslambda arg=value: my_callback(arg)
: el lambda tiene mucho más rudo (asignación a arg y luego uso) y no está claro cuál es la intención (podría estar haciendo algo sutilmente diferente en el lambda). Las importaciones no son realmente un problema (tienes un montón de todos modos y es una vez por archivo). El código se juzga mejor según lo bien que se lee, ypartial()
es mucho más fácil de leer que la lambda.Dudo que lambda se vaya. Vea la publicación de Guido sobre finalmente dejar de intentar eliminarlo. También vea un resumen 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
Mis propios dos centavos: rara vez vale la pena lambda en lo que respecta a la claridad. Generalmente hay una solución más clara que no incluye lambda.
fuente
En Python,
lambda
es solo una forma de definir funciones en línea,y..
..son exactamente lo mismo.
No hay nada que pueda hacer con lambda que no pueda hacer con una función regular: en Python las funciones son un objeto como cualquier otra cosa, y lambdas simplemente define una función:
Sinceramente, creo que la
lambda
palabra clave es redundante en Python: nunca he tenido la necesidad de usarla (o he visto una utilizada donde una función regular, una comprensión de lista o una de las muchas funciones integradas podrían haberse utilizado mejor)Para un ejemplo completamente al azar, del artículo "¡La lambda de Python está rota!" :
Yo diría que, incluso si eso funcionó, es horriblemente y "antipático", la misma funcionalidad podría escribirse de muchas otras maneras, por ejemplo:
Sí, no es lo mismo, pero nunca he visto una causa en la que se haya requerido generar un grupo de funciones lambda en una lista. Puede tener sentido en otros idiomas, pero Python no es Haskell (o Lisp, o ...)
Editar:
Hay algunos casos en los que lambda es útil, por ejemplo, a menudo es conveniente al conectar señales en aplicaciones PyQt, como esta:
Simplemente hacerlo
w.textChanged.connect(dothing)
llamaría aldothing
método con unevent
argumento adicional y causaría un error. El uso de lambda significa que podemos descartar el argumento sin tener que definir una función de ajuste.fuente
a
que definió no son exactamente las mismas. :) Se diferencian por__name__
campo al menos ...Encuentro lambda útil para una lista de funciones que hacen lo mismo, pero para diferentes circunstancias.
Como las reglas plurales de Mozilla :
Si tuviera que definir una función para todos esos, se volvería loco al final.
Además, no sería bueno con nombres de funciones como
plural_rule_1
,plural_rule_2
etc. Y lo necesitaríaseval()
cuando dependas de una identificación de función variable.fuente
Casi cualquier cosa que puedas hacer con
lambda
usted puede hacerlo mejor con funciones con nombre o con expresiones de lista y generador.En consecuencia, en su mayor parte, solo debe uno de esos en prácticamente cualquier situación (excepto tal vez para el código de borrador escrito en el intérprete interactivo).
fuente
He estado usando Python durante algunos años y nunca me he encontrado con un caso en el que necesito lambda. Realmente, como dice el tutorial , es solo para el azúcar sintáctico.
fuente
No puedo hablar de la implementación particular de lambda en Python, pero en general las funciones lambda son realmente útiles. Son una técnica central (quizás incluso LA técnica) de programación funcional, y también son muy útiles en programas orientados a objetos. Para ciertos tipos de problemas, son la mejor solución, por lo que no debe olvidarse.
Le sugiero que lea sobre los cierres y la función de mapa (que enlaza con documentos de Python, pero existe en casi todos los idiomas que admiten construcciones funcionales) para ver por qué es útil.
fuente
La función Lambda es una forma no burocrática de crear una función.
Eso es. Por ejemplo, supongamos que tiene su función principal y necesita ajustar los valores al cuadrado. Veamos la forma tradicional y la forma lambda de hacer esto:
Forma tradicional:
La forma lambda:
¿Ver la diferencia?
Las funciones de Lambda van muy bien con listas, como listas de comprensión o mapas. De hecho, la comprensión de la lista es una forma "pitónica" de expresarse usando lambda. Ex:
Veamos qué significa cada elemento de la sintaxis:
Eso es conveniente, ¿eh? Creando funciones como esta. Reescribámoslo usando lambda:
Ahora usemos map, que es lo mismo, pero más neutral en cuanto al idioma. Mapas toma 2 argumentos:
(i) una función
(ii) un iterable
Y le da una lista donde cada elemento es la función aplicada a cada elemento del iterable.
Entonces, usando el mapa tendríamos:
Si domina las lambdas y el mapeo, tendrá un gran poder para manipular datos y de manera concisa. Las funciones de Lambda no son oscuras ni eliminan la claridad del código. No confundas algo duro con algo nuevo. Una vez que comience a usarlos, lo encontrará muy claro.
fuente
Una de las cosas buenas de
lambda
mi opinión, esto es que es una forma de diferir una evaluación para formularios simples hasta que se necesite el valor. Dejame explicar.Se implementan muchas rutinas de biblioteca para que permitan que ciertos parámetros sean invocables (de los cuales lambda es uno). La idea es que el valor real se computará solo en el momento en que se va a usar (en lugar de cuando se lo llame). Un ejemplo (artificial) podría ayudar a ilustrar el punto. Supongamos que tiene una rutina que iba a registrar una marca de tiempo dada. Desea que la rutina use la hora actual menos 30 minutos. Lo llamarías así
Ahora suponga que la función real se llamará solo cuando ocurra un determinado evento y desee que la marca de tiempo se calcule solo en ese momento. Puedes hacer esto así
Suponiendo que la
log_timestamp
lata pueda manejar llamadas como esta, evaluará esto cuando lo necesite y obtendrá la marca de tiempo en ese momento.Por supuesto, hay formas alternativas de hacerlo (usando el
operator
módulo, por ejemplo), pero espero haber transmitido el punto.Actualización : Aquí hay un ejemplo un poco más concreto del mundo real.
Actualización 2 : creo que este es un ejemplo de lo que se llama un thunk .
fuente
Como se indicó anteriormente, el operador lambda en Python define una función anónima, y en Python las funciones son cierres. Es importante no confundir el concepto de cierres con el operador lambda, que es simplemente metadona sintáctica para ellos.
Cuando comencé en Python hace unos años, usaba muchas lambdas, pensando que eran geniales, junto con las listas de comprensión. Sin embargo, escribí y tengo que mantener un gran sitio web escrito en Python, con el orden de varios miles de puntos de función. Aprendí por experiencia que las lambdas pueden estar bien para hacer prototipos de cosas, pero no ofrecen nada sobre las funciones en línea (cierres con nombre), excepto para guardar algunas claves, o a veces no.
Básicamente esto se reduce a varios puntos:
Esa es razón suficiente para redondearlos y convertirlos en cierres con nombre. Sin embargo, guardo otros dos rencores contra los cierres anónimos.
El primer rencor es simplemente que son solo otra palabra clave innecesaria que satura el idioma.
El segundo rencor es más profundo y en el nivel de paradigma, es decir, no me gusta que promuevan un estilo de programación funcional, porque ese estilo es menos flexible que el paso de mensajes, orientado a objetos o estilos de procedimiento, porque el cálculo lambda no es Turing- completo (por suerte en Python, aún podemos romper esa restricción incluso dentro de una lambda). Las razones por las que siento que las lambdas promueven este estilo son:
Hay un retorno implícito, es decir, parece que 'deberían' ser funciones.
Son un mecanismo alternativo para ocultar el estado de otro mecanismo más explícito, más legible, más reutilizable y más general: los métodos.
Intento escribir Python libre de lambda y eliminar lambdas a la vista. Creo que Python sería un lenguaje un poco mejor sin lambdas, pero esa es solo mi opinión.
fuente
Y = lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))
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:
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:
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
¿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í:
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.
fuente
main
ydo_something_cool
? ¿Qué pasa conx
yy
en la función? ¿Los valores pasados parecen sobrescribirse inmediatamente? ¿Cómo sabe la funciónevent
? ¿Podría agregar algunos comentarios / explicaciones? Graciasx
yy
como argumentosdo-something-cool
y sus valores se establecen en la función para ilustrar cómo puede usar lambdas para pasar argumentos donde no se espera ninguno. Lawidget.bind
función espera unevent
parámetro que identifique el evento GUI en ese widget en particular. Recomiendo leer en el modelo de programación de Tkinter para mayor claridad.x,y
luego lo hacex=event.x
. ¿Eso no sobrescribe el valor que pasó? ¿Y cómo sabe la función quéevent
es? No veo dónde pasas eso a la función. ¿O es un método? ¿También se le permiten signos menos en el nombre de una función?x, y
, eso es solo un ejemplo con fines ilustrativos. Estoy tratando de mostrar el poder de las lambdas, no de Tkinter. :)event
? en ese caso, ¿no debería leer tu lambdalambda event: do_something_cool(event,x,y)
?Las lambdas están profundamente vinculadas al estilo de programación funcional en general. La idea de que puede resolver problemas aplicando una función a algunos datos y fusionando los resultados es lo que google utiliza para implementar la mayoría de sus algoritmos.
Los programas escritos en un estilo de programación funcional, se paralelizan fácilmente y, por lo tanto, se vuelven cada vez más importantes con las máquinas modernas de múltiples núcleos. En resumen, NO, no debes olvidarlos.
fuente
Primeras felicitaciones que lograron descubrir lambda. En mi opinión, esta es una construcción realmente poderosa para actuar. La tendencia en estos días hacia los lenguajes de programación funcional es seguramente un indicador de que no debe evitarse ni redefinirse en un futuro próximo.
Solo tienes que pensar un poco diferente. Estoy seguro de que pronto te encantará. Pero ten cuidado si solo tratas con python. Debido a que el lambda no es un cierre real, está "roto" de alguna manera: pitones lambda está roto
fuente
Tenga en cuenta que esto no es una condena de nada. Todo el mundo tiene un conjunto diferente de cosas que no son fáciles.
No.
No es oscuro En los últimos 2 equipos en los que he trabajado, todos usaron esta función todo el tiempo.
No he visto propuestas serias para redefinirlo en Python, más allá de arreglar la semántica de cierre hace unos años.
No está menos claro, si lo estás usando bien. Por el contrario, tener más construcciones de lenguaje disponibles aumenta la claridad.
Lambda es como desbordamiento de búfer? Guau. No puedo imaginar cómo estás usando lambda si crees que es una "pesadilla de mantenimiento".
fuente
Yo uso lambdas para evitar la duplicación de código. Haría la función fácilmente comprensible, por ejemplo:
Reemplazo eso con una temperatura lambda
fuente
Hoy comencé a leer el libro de David Mertz "Procesamiento de texto en Python". Si bien tiene una descripción bastante concisa de Lambda, los ejemplos en el primer capítulo combinados con la explicación en el Apéndice A los hicieron saltar de la página para mí (finalmente) y de repente entendí su valor. Eso no quiere decir que su explicación funcione para usted y todavía estoy en la etapa de descubrimiento, así que no intentaré agregar a estas respuestas más que lo siguiente: Soy nuevo en Python Soy nuevo en OOP Lambdas fue una lucha para mí Ahora que leí Mertz, creo que los entiendo y los veo tan útiles como creo que permiten un enfoque más limpio de la programación.
Reproduce el Zen de Python, una línea de la cual es simple es mejor que compleja. Como un programador que no es OOP leyendo códigos con lambdas (y hasta la semana pasada comprendo la lista), pensé: ¿ Esto es simple? . Finalmente me di cuenta hoy de que en realidad estas características hacen que el código sea mucho más legible y comprensible que la alternativa, que es invariablemente un bucle de algún tipo. También me di cuenta de que, como los estados financieros, Python no fue diseñado para el usuario novato, sino que está diseñado para el usuario que quiere educarse. No puedo creer lo poderoso que es este lenguaje. Cuando caí en la cuenta (finalmente) el propósito y el valor de las lambdas, quería desarrollar unos 30 programas y comenzar a poner lambdas cuando sea apropiado.
fuente
Un caso útil para usar lambdas es mejorar la legibilidad de las comprensiones de listas largas . En este ejemplo
loop_dic
es corto para mayor claridad, pero imagina queloop_dic
es muy largo. Si solo usara un valor simple que incluyera eni
lugar de la versión lambda de ese valor, obtendría unNameError
.En vez de
fuente
Puedo darte un ejemplo donde realmente necesitaba lambda serio. Estoy haciendo un programa gráfico, donde el uso hace clic derecho en un archivo y le asigna una de las tres opciones. Resulta que en Tkinter (el programa de interfaz GUI en el que estoy escribiendo esto), cuando alguien presiona un botón, no se puede asignar a un comando que toma argumentos. Entonces, si elegí una de las opciones y quería que el resultado de mi elección fuera:
Entonces no es gran cosa. Pero, ¿y si necesito mi elección para tener un detalle particular? Por ejemplo, si elijo la opción A, llama a una función que incluye algún argumento que depende de la opción A, B o C, TKinter no podría admitir esto. Lamda era la única opción para evitar esto en realidad ...
fuente
def foo...
y luego pasar enfoo
lugar de hacerlolambda
. Es solo más código y tienes que encontrar un nombre.Lo uso con bastante frecuencia, principalmente como un objeto nulo o para vincular parcialmente parámetros a una función.
Aquí hay ejemplos:
para implementar un patrón de objeto nulo:
para el enlace de parámetros:
Digamos que tengo la siguiente API
Luego, cuando quiero volcar rápidamente los datos recibidos en un archivo, hago eso:
fuente
yo suelo
lambda
para crear devoluciones de llamada que incluyen parámetros. Es más limpio escribir un lambda en una línea que escribir un método para realizar la misma funcionalidad.Por ejemplo:
Opuesto a:
fuente
Soy un principiante en python, así que para obtener una idea clara de lambda lo comparé con un bucle 'for'; en términos de eficiencia. Aquí está el código (python 2.7):
fuente
timeit
módulo, que generalmente brinda resultados más precisos que restartime.time()
valores.Lambda es un constructor de procedimientos. Puede sintetizar programas en tiempo de ejecución, aunque la lambda de Python no es muy potente. Tenga en cuenta que pocas personas entienden ese tipo de programación.
fuente