¿Qué es la función Lambda en Python?
Una función Lambda en la programación de Python 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.
En Python, las expresiones lambda (o formas lambda) se utilizan para construir funciones anónimas. Para hacerlo, usará la palabra clave lambda (tal como usa def para definir funciones normales). Cada función anónima que defina 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 una 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.
En este tutorial de Lambda en Python, aprenderá:
- Sintaxis y ejemplos
- Usando lambdas con Python incorporado
- lambdas en el filtro ()
- lambdas en el mapa ()
- lambdas en reducir ()
- ¿Por qué (y por qué no) usar funciones lambda?
- Lambdas vs.Funciones regulares
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 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 opere en los parámetros que proporcionas a la función.
Ejemplo 1
Ahora que conoce las lambdas, probémoslo con un ejemplo. Entonces, abra su IDLE y escriba lo siguiente:
adder = lambda x, y: x + yprint (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 le pasamos a la función lambda.
3. Este es el cuerpo de la función, que suma los 2 parámetros que pasamos. Observe que es una sola expresión. No puede escribir varias declaraciones en el cuerpo de una función lambda.
4. Llamamos a la función e imprimimos el valor devuelto.
Ejemplo 2
Ese fue un ejemplo básico para comprender los fundamentos y la sintaxis de lambda. Intentemos ahora imprimir una lambda y ver el resultado. Nuevamente, abra su IDLE y escriba lo siguiente:
#What a lambda returnsstring='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.
Producción:
at 0x00000185C3BF81E0>
¿Que esta pasando aqui? Veamos el código para entenderlo mejor.
Explicación del código
- Aquí, definimos una cadena que pasará como parámetro a 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 función de impresión no llama a lambda, sino que simplemente devuelve el objeto de función y la ubicación de memoria donde se almacena. Eso es lo que se imprime en la consola.
Ejemplo 3
Sin embargo, si escribe un programa como este:
#What a lambda returns #2x="some kind of a useless lambda"(lambda x : print(x))(x)
Y ejecútelo presionando F5, verá una salida como esta.
Producción:
some kind of a useless lambda
Ahora, se llama a la lambda y la cadena que pasamos se imprime en la consola. Pero, ¿cuál es esa sintaxis extraña y por qué la definición lambda está cubierta entre paréntesis? Entendamos 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 él en las próximas secciones de este tutorial.
Ejemplo 4
Veamos un ejemplo final para comprender cómo se ejecutan las lambdas y las funciones regulares. Entonces, abra su IDLE y en un nuevo archivo, escriba lo siguiente:
#A REGULAR FUNCTIONdef guru( funct, *args ):funct( *args )def printer_one( arg ):return print (arg)def printer_two( arg ):print(arg)#CALL A REGULAR FUNCTIONguru( printer_one, 'printer 1 REGULAR CALL' )guru( printer_two, 'printer 2 REGULAR CALL \n' )#CALL A REGULAR FUNCTION THRU A LAMBDAguru(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, la salida debería ser algo como esto.
Producción:
impresora 1 LLAMADA REGULAR
impresora 2 LLAMADA REGULAR
impresora 1 LAMBDA CALL
impresora 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.
- printer_two es similar a printer_one pero sin la declaración de retorno.
- En esta parte, llamamos a la función guru y pasamos las funciones de la impresora y una cadena como parámetros.
- Esta es la sintaxis para lograr el cuarto paso (es decir, llamar a la función guru) pero usando lambdas.
En la siguiente sección, aprenderá a usar funciones lambda con map (), reduce () y filter () en Python.
Usando lambdas con Python incorporado
Las funciones de Lambda proporcionan una forma elegante y poderosa de realizar operaciones utilizando métodos integrados en Python. Es posible porque las lambdas se pueden invocar inmediatamente y pasar como argumento a estas funciones.
IIFE en Python Lambda
IIFE significa ejecución de función invocada inmediatamente. Significa que una función lambda es invocable tan pronto como se define. Entendamos esto con un ejemplo; encienda su IDLE y escriba lo siguiente:
(lambda x: x + x)(2)
Aquí está la salida y la explicación del código:
Esta capacidad de invocación inmediata de lambdas 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 el 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. Toma 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á el resultado:
[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 filter_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. Imprima el resultado devuelto por la función de filtro.
lambdas en el mapa ()
la función de mapa se usa para aplicar una operación particular a cada elemento en una secuencia. Al igual que filter (), también toma 2 parámetros:
- Una función que define la operación a realizar en los elementos.
- Una o más secuencias
Por ejemplo, aquí hay un programa que imprime los cuadrados de 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))
Producción:
[100, 4, 64, 49, 25, 16, 121, 0, 1]
[KR1]
Explicación del código:
- Aquí, definimos una lista llamada secuencias que contiene algunos números.
- Declaramos una variable llamada filter_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 de reducción, como map (), se usa para aplicar una operación a cada elemento de una secuencia. Sin embargo, se diferencia del mapa en su funcionamiento. Estos son los pasos seguidos por la función reduce () para calcular una salida:
Paso 1) Realice la operación definida en los primeros 2 elementos de la secuencia.
Paso 2) Guarda este resultado
Paso 3) Realice 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 reducesequences = [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 de funciones
- 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) usar 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 sola expresión.
Sin embargo, debe saber cuándo es una buena idea usar 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, ya que 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ía utilizar 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 se encuentra haciendo 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 vs.Funciones regulares
Como se indicó anteriormente, las lambdas son [vV4] [J5] solo funciones que no tienen un identificador vinculado a ellas. 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 solo pueden tener una expresión en su cuerpo.
Las funciones regulares pueden tener múltiples expresiones y declaraciones en su cuerpo.
Las lambdas no tienen un nombre asociado. Por eso también se conocen como funciones anónimas.
Las funciones regulares deben tener nombre y firma.
Las 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 retorno.
¿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 produce un objeto de función. En consecuencia, podemos nombrar el resultado de la función lambda y usarlo en nuestro programa como hicimos en el ejemplo anterior.
Una función normal para el ejemplo anterior se vería así:
def adder (x, y):return x + yprint (adder (1, 2))
Aquí, tenemos que definir un nombre para la función que devuelve el resultado cuando la llamamos . Una función lambda no contiene una declaración de retorno porque solo tendrá una expresión que siempre se devuelve de forma predeterminada. Ni siquiera tiene que asignar una lambda, ya que puede invocarse inmediatamente (consulte la siguiente sección). Como verá en el siguiente ejemplo, las lambdas se vuelven particularmente poderosas cuando las usamos con las funciones integradas de Python.
Sin embargo, es posible que todavía se pregunte en qué se diferencian las lambdas de una función que devuelve una sola expresión (como la de arriba). A nivel de intérprete, no hay mucha diferencia. Puede sonar sorprendente, pero el intérprete trata cualquier función lambda que defina en Python como una función normal.
Como puede ver en el diagrama, el intérprete de Python maneja las dos definiciones de la misma manera cuando se convierte a código de bytes. Ahora, no puede nombrar una función lambda porque está reservada por Python, pero cualquier otro nombre de función producirá el mismo código de bytes [KR6].
Resumen
- Las 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 un lambda es: parámetro lambda: expresión
- Las lambdas pueden tener cualquier número de parámetros, pero no están entre llaves
- Una lambda solo puede tener 1 expresión en su cuerpo de 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 lambdas y las funciones regulares.
- Lambdas admite IIFE a través de esta sintaxis: (parámetro lambda: expresión) (argumento)
- Las lambdas se usan comúnmente con las siguientes incorporaciones 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 quienes mantienen el código.
[J5] Agregué una tabla, pero la explicación es necesaria para comprender las diferencias.