Python Funciones Lambda con EJEMPLOS

โšก Resumen inteligente

Funciones Lambda en Python Son funciones anรณnimas pequeรฑas definidas con la palabra clave lambda en lugar de def. Contienen una sola expresiรณn, aceptan cualquier nรบmero de argumentos y a menudo se pasan directamente a funciones integradas como map(), filter() y sorted().

  • ๐Ÿ”‘ Palabra clave Lambda: Una expresiรณn lambda se escribe como argumentos lambda: expresiรณn, sin definiciรณn, sin nombre y sin instrucciรณn de retorno explรญcita.
  • ๐Ÿงฎ Expresiรณn รบnica: El cuerpo contiene exactamente una expresiรณn cuyo valor se devuelve automรกticamente, por lo que no se permiten sentencias ni varias lรญneas.
  • ๐Ÿ”— Emparejamiento integrado: Las funciones lambda se suelen pasar a las funciones map(), filter(), reduce() y sorted() para transformar o seleccionar elementos en una secuencia.
  • โšก IIFE: Se puede definir y llamar inmediatamente a una funciรณn lambda utilizando el patrรณn (lambda x: x + x)(2), devolviendo un resultado al instante.
  • ๐Ÿ‡ง๐Ÿ‡ท Versus def: Las funciones regulares necesitan un nombre y pueden contener muchas instrucciones, mientras que las expresiones lambda sacrifican esa potencia a cambio de una sintaxis compacta de una sola lรญnea.
  • ๐Ÿค– Asistencia de IA: Los asistentes de IA, como GitHub Copilot, generan expresiones lambda para mapear, filtrar y ordenar claves a partir de una breve instrucciรณn.

Python Funciones lambda

ยฟ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, observe que no usamos corchetes alrededor de los parรกmetros como lo hacemos con las funciones regulares. La รบltima parte (expresiรณn) es cualquier valor vรกlido. Python expresiรณn 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))

Code Explicaciรณn

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. Ahora intentemos imprimir una lambda y veamos el resultado. Nuevamente, 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>

ยฟQuรฉ estรก pasando aquรญ? Analicemos el cรณdigo para comprenderlo mejor.

Code Explicaciรณn:

1. Aquรญ definimos un cadena que pasarรกs como parรกmetro a la funciรณn lambda.

2. Declaramos una funciรณn lambda que llama a una instrucciรณn print e imprime el resultado.

Pero ยฟpor quรฉ el programa no imprime la cadena que pasamos? Esto se debe a que la propia expresiรณn lambda devuelve un objeto de funciรณn. En este ejemplo, la expresiรณn lambda no estรก siendo , que son por la funciรณn de impresiรณn pero es simplemente volver El objeto de la 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รบtalo pulsando F5, verรกs una salida como esta.

Salida:

some kind of a useless lambda

Ahora, se llama a la funciรณn lambda y la cadena que le pasamos se imprime en la consola. Pero, ยฟquรฉ es esa sintaxis extraรฑa y por quรฉ la definiciรณn de la funciรณn lambda estรก entre corchetes? Vamos a entenderlo ahora.

Code Explicaciรณn:

1. Aquรญ estรก la misma cadena que definimos en el ejemplo anterior.

2. En esta parte, definimos una funciรณn lambda y la llamamos inmediatamente pasรกndole la cadena como argumento. Esto se conoce como IIFE (ejecuciรณn automรกtica de segunda instancia), y aprenderรกs mรกs sobre ello en las siguientes secciones de este tutorial.

Ejemplo

Veamos un รบltimo ejemplo para comprender cรณmo se ejecutan las funciones lambda 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, guarda el archivo y pulsa F5 para ejecutar el programa. Si no has cometido ningรบn error, el resultado deberรญa ser similar a este.

Salida:

printer 1 REGULAR CALL

printer 2 REGULAR CALL

printer 1 LAMBDA CALL

printer 2 LAMBDA CALL

Code Explicaciรณn:

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. printer_two es similar a printer_one pero sin la instrucciรณn return.

4. En esta parte, llamamos a la funciรณn guru y le pasamos 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 guru) 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. Esto significa que una funciรณn lambda se puede llamar tan pronto como se define. Entendamos esto con un ejemplo; inicie su 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 una restricciรณn predefinida. Requiere 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]

Code Explicaciรณn:

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 toma 2 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]

Code Explicaciรณn:

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 map.

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) Guarda 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

Code Explicaciรณn:

1. Importa reduce del 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 reduce.

ยฟ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 usar lambdas y cuรกndo evitarlas. En esta secciรณn, aprenderรกs algunos de los principios de diseรฑo utilizados por Python desarrolladores al escribir funciones lambda.

Uno de los casos de uso mรกs comunes para las expresiones lambda es en la programaciรณn funcional, ya que Python admite un paradigma (o estilo) de programaciรณn conocido como programaciรณn funcional.

Permite pasar una funciรณn como parรกmetro a otra funciรณn (por ejemplo, en map, filter, etc.). En estos casos, el uso de expresiones lambda ofrece una forma elegante de crear una funciรณn de un solo uso 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 simplemente funciones que no tienen un identificador asociado. En otras palabras, son funciones sin nombre (por lo tanto, anรณnimas). Aquรญ hay una tabla para ilustrar la diferencia entre las lambdas y las 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.
Las funciones lambda no tienen un nombre asociado. Por eso tambiรฉn se las 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 un valor deben incluir una instrucciรณn return.

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 instrucciรณn return porque solo tendrรก una รบnica expresiรณn que siempre se devuelve por defecto. Ni siquiera es necesario asignar una lambda, ya que se puede invocar inmediatamente (vรฉase la secciรณn anterior). Como verรก, 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.

A nivel de cรณdigo de bytes, las dos definiciones son manejadas de la misma manera por el Python intรฉrprete. 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.

Preguntas Frecuentes

Sรญ. Una expresiรณn lambda puede usar una expresiรณn condicional como `lambda x: 'par' if x % 2 == 0 else 'impar'`. No puede contener una sentencia `if` completa, ya que el cuerpo de una expresiรณn lambda debe ser una sola expresiรณn y no un bloque de sentencias.

Generalmente no. PEP 8 recomienda usar def cuando una funciรณn necesita un nombre, porque vincular una lambda a una variable le da un nombre pero pierde la claridad. traceback que proporciona def. Lo mejor es pasar las expresiones lambda directamente a funciones como sorted(), map() o filter().

No. A nivel de cรณdigo de bytes. Python Trata una expresiรณn lambda y una definiciรณn equivalente de la misma manera, por lo que no hay ventaja en cuanto a velocidad. Una expresiรณn lambda solo ahorra una lรญnea de cรณdigo; no se ejecuta mรกs rรกpido que una funciรณn con nombre que realiza el mismo trabajo.

Sรญ. Una expresiรณn lambda puede leer variables del รกmbito que la contiene, formando un cierre. Dentro de un bucle, ten cuidado: la expresiรณn lambda captura la variable en sรญ, no su valor actual, asรญ que usa un argumento predeterminado como `lambda x, n=n: x + n` para congelarla.

Pasa una expresiรณn lambda como argumento clave a sorted() o list.sort(). Por ejemplo, sorted(users, key=lambda u: u['age']) ordena los elementos por edad. La expresiรณn lambda indica Python quรฉ valor comparar para cada elemento, lo que permite una ordenaciรณn personalizada y concisa sin necesidad de una funciรณn con nombre independiente.

No directamente, ya que una expresiรณn lambda anรณnima no tiene nombre al que hacer referencia. Puedes solucionar esto asignando la expresiรณn lambda a una variable y llamando a esa variable, pero una funciรณn `def` normal es la opciรณn mรกs clara y recomendada para la recursiรณn.

Las funciones Lambda potencian transformaciones rรกpidas y en lรญnea en el cรณdigo de IA y aprendizaje automรกtico. Los cientรญficos de datos las pasan a pandas .apply(), map() y filter() para limpiar o reformatear datos, y como funciones clave para ordenar caracterรญsticas, mantenerping preprocesamiento compacto dentro de pipelines de entrenamiento mรกs grandes.

GitHub Copilot sugiere expresiones lambda completas a partir de un comentario breve o del cรณdigo circundante, incluyendo los parรกmetros y la expresiรณn correctos para las llamadas a map(), filter() o sorted(). Tambiรฉn puede proponer la conversiรณn de una expresiรณn lambda extensa en una funciรณn con nombre mรกs claro cuando la legibilidad es importante.

Resumir este post con: