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

  1. Aquรญ, definimos un cadena que pasarรกs como parรกmetro a la lambda.
  2. 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

  1. Aquรญ estรก la misma cadena que definimos en el ejemplo anterior.
  2. 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

  1. Una funciรณn llamada guru que toma otra funciรณn como primer parรกmetro y cualquier otro argumento que le siga.
  2. Printer_one es una funciรณn simple que imprime el parรกmetro que se le pasa y lo devuelve.
  3. impresora_dos es similar a impresora_uno pero sin la declaraciรณn de devoluciรณn.
  4. En esta parte, llamaremos a la funciรณn guru y pasaremos las funciones de impresora y una cadena como parรกmetros.
  5. 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 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 son las siglas de 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:

  1. Una funciรณn que define la operaciรณn a realizar sobre los elementos.
  2. 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:

  1. Aquรญ, definimos una lista llamada secuencias que contiene algunos nรบmeros.
  2. Declaramos una variable llamada filtered_result que almacenarรก los valores mapeados.
  3. Una funciรณn lambda que se ejecuta en cada elemento de la lista y devuelve el cuadrado de ese nรบmero.
  4. 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:

  1. Una funciรณn que define la operaciรณn a realizar
  2. 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:

  1. Importar reducir desde el mรณdulo functools
  2. Aquรญ, definimos una lista llamada secuencias que contiene algunos nรบmeros.
  3. Declaramos una variable llamada producto que almacenarรก el valor reducido.
  4. 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.
  5. 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 Llame 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.

Resumir este post con: