Python Funciones Lambda con EJEMPLOS
¿En qué consiste la función Lambda? Python?
A Función Lambda en Python La programación es una función anónima o una función que no tiene nombre. Es una función pequeña y restringida que no tiene más de una línea. Al igual que una función normal, una función Lambda puede tener varios argumentos con una expresión.
In Python, las expresiones lambda (o formas lambda) se utilizan para construir funciones anónimas. Para ello utilizará el lambda palabra clave (tal como la usas def para definir funciones normales). Cada función anónima que definas en Python tendrá 3 partes esenciales:
- La palabra clave lambda.
- Los parámetros (o variables vinculadas), y
- El cuerpo funcional.
Una función lambda puede tener cualquier número de parámetros, pero el cuerpo de la función solo puede contener uno expresión. Además, una lambda se escribe en una sola línea de código y también se puede invocar inmediatamente. Verá todo esto en acción en los próximos ejemplos.
Sintaxis y ejemplos
La sintaxis formal para escribir una función lambda es la siguiente:
lambda p1, p2: expression
Aquí, p1 y p2 son los parámetros que se pasan a la función lambda. Puede agregar tantos o pocos parámetros como necesite.
Sin embargo, tenga en cuenta que no usamos corchetes alrededor de los parámetros como lo hacemos con las funciones regulares. La última parte (expresión) es cualquier expresión de Python válida que opera sobre los parámetros que usted proporciona a la función.
Ejemplo
Ahora que ya conoces las lambdas, probémoslo con un ejemplo. Entonces, abre tu IDLE y escribe lo siguiente:
adder = lambda x, y: x + y print (adder (1, 2))
Aquí está el resultado:
3
Explicación del código
Aquí, definimos una variable que contendrá el resultado devuelto por la función lambda.
1. La palabra clave lambda utilizada para definir una función anónima.
2. xey son los parámetros que pasamos a la función lambda.
3. Este es el cuerpo de la función, que agrega los 2 parámetros que pasamos. Observe que es una expresión única. No se pueden escribir varias declaraciones en el cuerpo de una función lambda.
4. Llamamos a la función e imprimimos el valor devuelto.
Ejemplo
Ese fue un ejemplo básico para comprender los fundamentos y la sintaxis de lambda. Intentemos ahora imprimir una lambda y ver el resultado. De nuevo, abre tu IDLE y escribe lo siguiente:
#What a lambda returns string='some kind of a useless lambda' print(lambda string : print(string))
Ahora guarde su archivo y presione F5 para ejecutar el programa. Este es el resultado que debería obtener.
Salida:
<function <lambda> at 0x00000185C3BF81E0>
¿Que esta pasando aqui? Veamos el código para comprenderlo mejor.
Explicación del código
- Aquí, definimos un cadena que pasarás como parámetro a la lambda.
- Declaramos una lambda que llama a una declaración de impresión e imprime el resultado.
Pero ¿por qué el programa no imprime la cadena que pasamos? Esto se debe a que la propia lambda devuelve un objeto de función. En este ejemplo, la lambda no está siendo , que son por la función de impresión pero simplemente volver el objeto de función y la ubicación de memoria donde se almacena. Eso es lo que se imprime en la consola.
Ejemplo
Sin embargo, si escribes un programa como este:
#What a lambda returns #2 x="some kind of a useless lambda" (lambda x : print(x))(x)
Y ejecútelo presionando F5, verá un resultado como este.
Salida:
some kind of a useless lambda
Ahora, se llama a la función lambda y la cadena que pasamos se imprime en la consola. Pero, ¿qué es esa sintaxis extraña y por qué la definición de lambda está entre corchetes? Comprendamos eso ahora.
Explicación del código
- Aquí está la misma cadena que definimos en el ejemplo anterior.
- En esta parte, definimos una lambda y la llamamos inmediatamente pasando la cadena como argumento. Esto es algo llamado IIFE y aprenderá más sobre ello en las próximas secciones de este tutorial.
Ejemplo
Veamos un ejemplo final para comprender cómo se ejecutan las lambdas y las funciones regulares. Entonces, abre tu IDLE y en un nuevo archivo escribe lo siguiente:
#A REGULAR FUNCTION def guru( funct, *args ): funct( *args ) def printer_one( arg ): return print (arg) def printer_two( arg ): print(arg) #CALL A REGULAR FUNCTION guru( printer_one, 'printer 1 REGULAR CALL' ) guru( printer_two, 'printer 2 REGULAR CALL \n' ) #CALL A REGULAR FUNCTION THRU A LAMBDA guru(lambda: printer_one('printer 1 LAMBDA CALL')) guru(lambda: printer_two('printer 2 LAMBDA CALL'))
Ahora, guarde el archivo y presione F5 para ejecutar el programa. Si no cometió ningún error, el resultado debería ser algo como esto.
Salida:
printer 1 REGULAR CALL printer 2 REGULAR CALL printer 1 LAMBDA CALL printer 2 LAMBDA CALL
Explicación del código
- Una función llamada guru que toma otra función como primer parámetro y cualquier otro argumento que le siga.
- Printer_one es una función simple que imprime el parámetro que se le pasa y lo devuelve.
- impresora_dos es similar a impresora_uno pero sin la declaración de devolución.
- En esta parte, llamaremos a la función guru y pasaremos las funciones de impresora y una cadena como parámetros.
- Esta es la sintaxis para lograr el cuarto paso (es decir, llamar a la función gurú) pero usando lambdas.
En la siguiente sección, aprenderá cómo utilizar funciones lambda con mapa(), reducir(), y la filtrar() in Python.
Usando lambdas con Python incorporados
Las funciones Lambda proporcionan una forma elegante y poderosa de realizar operaciones utilizando métodos integrados en Python. Es posible porque las lambdas pueden invocarse inmediatamente y pasarse como argumento a estas funciones.
IIFE en Python lambda
IFE representa Invocó inmediatamente la ejecución de la función. Significa que se puede llamar a una función lambda tan pronto como se define. Entendamos esto con un ejemplo; enciende tu IDLE y escribe lo siguiente:
(lambda x: x + x)(2)
Aquí está el resultado y la explicación del código:
Esta capacidad de las lambdas para ser invocadas inmediatamente le permite usarlas dentro de funciones como map() y reduce(). Es útil porque es posible que no desee volver a utilizar estas funciones.
lambdas en filtro()
La función de filtro se utiliza para seleccionar algunos elementos particulares de una secuencia de elementos. La secuencia puede ser cualquier iterador como listas, conjuntos, tuplas, etc.
Los elementos que se seleccionarán se basan en alguna restricción predefinida. Se necesitan 2 parámetros:
- Una función que define la restricción de filtrado.
- Una secuencia (cualquier iterador como listas, tuplas, etc.)
Por ejemplo,
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = filter (lambda x: x > 4, sequences) print(list(filtered_result))
Aquí está la salida:
[10, 8, 7, 5, 11]
Explicación del código:
1. En la primera declaración, definimos una lista llamada secuencias que contiene algunos números.
2. Aquí, declaramos una variable llamada filtered_result, que almacenará los valores filtrados devueltos por la función filter().
3. Una función lambda que se ejecuta en cada elemento de la lista y devuelve verdadero si es mayor que 4.
4. Imprime el resultado devuelto por la función de filtro.
lambdas en el mapa()
La función map se utiliza para aplicar una operación particular a cada elemento de una secuencia. Al igual que filter(), también acepta dos parámetros:
- Una función que define la operación a realizar sobre los elementos.
- Una o más secuencias
Por ejemplo, aquí hay un programa que imprime los cuadrados de los números en una lista dada:
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = map (lambda x: x*x, sequences) print(list(filtered_result))
Salida:
[100, 4, 64, 49, 25, 16, 9, 121, 0, 1]
[KR1]
Explicación del código:
- Aquí, definimos una lista llamada secuencias que contiene algunos números.
- Declaramos una variable llamada filtered_result que almacenará los valores mapeados.
- Una función lambda que se ejecuta en cada elemento de la lista y devuelve el cuadrado de ese número.
- Imprime el resultado devuelto por la función de mapa.
lambdas en reducir()
La función reduce, al igual que map(), se utiliza para aplicar una operación a cada elemento de una secuencia. Sin embargo, difiere de map en su funcionamiento. Estos son los pasos que sigue la función reduce() para calcular un resultado:
Paso 1) Realizar la operación definida en los 2 primeros elementos de la secuencia.
Paso 2) Guardar este resultado
Paso 3) Realizar la operación con el resultado guardado y el siguiente elemento de la secuencia.
Paso 4) Repita hasta que no queden más elementos.
También toma dos parámetros:
- Una función que define la operación a realizar
- Una secuencia (cualquier iterador como listas, tuplas, etc.)
Por ejemplo, aquí hay un programa que devuelve el producto de todos los elementos de una lista:
from functools import reduce sequences = [1,2,3,4,5] product = reduce (lambda x, y: x*y, sequences) print(product)
Aquí está el resultado:
120
Explicación del código:
- Importar reducir desde el módulo functools
- Aquí, definimos una lista llamada secuencias que contiene algunos números.
- Declaramos una variable llamada producto que almacenará el valor reducido.
- Una función lambda que se ejecuta en cada elemento de la lista. Devolverá el producto de ese número según el resultado anterior.
- Imprime el resultado devuelto por la función de reducción.
¿Por qué (y por qué no) utilizar funciones lambda?
Como verá en la siguiente sección, las lambdas se tratan de la misma manera que las funciones regulares a nivel de intérprete. En cierto modo, se podría decir que las lambdas proporcionan una sintaxis compacta para escribir funciones que devuelven una única expresión.
Sin embargo, debes saber cuándo es una buena idea utilizar lambdas y cuándo evitarlas. En esta sección, aprenderá algunos de los principios de diseño utilizados por los desarrolladores de Python al escribir lambdas.
Uno de los casos de uso más comunes de lambdas es la programación funcional como Python admite un paradigma (o estilo) de programación conocido como programación funcional.
Le permite proporcionar una función como parámetro a otra función (por ejemplo, en mapa, filtro, etc.). En tales casos, el uso de lambdas ofrece una forma elegante de crear una función única y pasarla como parámetro.
¿Cuándo no deberías usar Lambda?
Nunca debe escribir funciones lambda complicadas en un entorno de producción. Será muy difícil para los programadores que mantienen su código descifrarlo. Si crea expresiones complejas de una sola línea, sería una práctica mucho mejor definir una función adecuada. Como práctica recomendada, debe recordar que el código simple siempre es mejor que el código complejo.
Lambdas frente a funciones regulares
Como se indicó anteriormente, las lambdas son [vV4][J5] solo funciones que no tienen un identificador asociado. En palabras más simples, son funciones sin nombre (por lo tanto, anónimas). Aquí hay una tabla para ilustrar la diferencia entre lambdas y funciones regulares en Python.
lambdas
Funciones regulares
Sintaxis:
lambda x : x + x
Sintaxis:
def (x) : return x + x
Las funciones lambda sólo pueden tener una expresión en su cuerpo.
Las funciones regulares pueden tener múltiples expresiones y declaraciones en su cuerpo.
Lambdas no tienen un nombre asociado. Por eso también se les conoce como funciones anónimas.
Las funciones regulares deben tener nombre y firma.
Lambdas no contienen una declaración de devolución porque el cuerpo se devuelve automáticamente.
Las funciones que necesitan devolver valor deben incluir una declaración de devolución.
¿Explicación de las diferencias?
La principal diferencia entre una función lambda y una función regular es que la función lambda evalúa solo una expresión y genera un objeto de función. En consecuencia, podemos nombrar el resultado de la función lambda y usarlo en nuestro programa como lo hicimos en el ejemplo anterior.
Una función normal para el ejemplo anterior se vería así:
def adder (x, y): return x + y print (adder (1, 2))
Aquí tenemos que definir un nombre para la función que devoluciones el resultado cuando nosotros llamar al Una función lambda no contiene una declaración de retorno porque tendrá una única expresión que siempre se devuelve de forma predeterminada. Ni siquiera tienes que asignar una lambda, ya que se puede invocar de inmediato (consulta la siguiente sección). Como verás en el siguiente ejemplo, las lambdas se vuelven particularmente poderosas cuando las usamos con PythonFunciones integradas.
Sin embargo, es posible que todavía te preguntes en qué se diferencian las lambdas de una función que devuelve una sola expresión (como la anterior). A nivel de intérprete no hay mucha diferencia. Puede parecer sorprendente, pero cualquier función lambda que defina en Python es tratada como una función normal por el intérprete.
Como puede ver en el diagrama, el intérprete de Python maneja las dos definiciones de la misma manera cuando las convierte a código de bytes. Ahora, no puedes nombrar una función. lambda porque está reservado por Python, pero cualquier otro nombre de función producirá el mismo código de bytes[KR6].
Resumen
- Lambdas, también conocidas como funciones anónimas, son funciones pequeñas y restringidas que no necesitan un nombre (es decir, un identificador).
- Cada función lambda en Python tiene 3 partes esenciales:
- La palabra clave lambda.
- Los parámetros (o variables vinculadas), y
- El cuerpo funcional.
- La sintaxis para escribir una lambda es: parámetro lambda: expresión
- Lambdas puede tener cualquier número de parámetros, pero no están entre llaves
- Una lambda solo puede tener 1 expresión en el cuerpo de su función, que se devuelve de forma predeterminada.
- A nivel de código de bytes, no hay mucha diferencia entre cómo el intérprete maneja las funciones lambdas y regulares.
- Lambdas admite IIFE a través de esta sintaxis: (parámetro lambda: expresión) (argumento)
- Las lambdas se utilizan comúnmente con los siguientes elementos integrados de Python:
- Filtro: filtro (parámetro lambda: expresión, secuencia iterable)
- Mapa: mapa (parámetro lambda: expresión, secuencias iterables)
- Reducir: reducir (parámetro lambda1, parámetro2: expresión, secuencia iterable)
- No escriba funciones lambda complicadas en un entorno de producción porque será difícil para los encargados del mantenimiento del código.
[J5]He añadido una tabla, pero la explicación es necesaria para entender las diferencias.