Breaking

Post Top Ad

Your Ad Spot

jueves, 8 de agosto de 2019

Python Lambdas explicado (con ejemplos)

En este artículo, te enseñaré exactamente qué es una pitón lambda.
De hecho, si sabes qué son las funciones y cómo definirlas en Python, entonces ya sabes qué es una lambda.
Una lambda de Python es solo una función de Python.
Pero puede ser como un tipo especial de función que tiene capacidades limitadas 🙂
Si desea profundizar y aprender más sobre lambdas y cómo se usan en Python, de esto se trata este artículo.
Esto es de lo que hablaré en este artículo.

¿Qué es Python lambda?

Antes de intentar comprender qué es una lambda Python, intentemos comprender qué es una función Python a un nivel mucho más profundo.
Esto requerirá un pequeño cambio de paradigma de cómo piensas acerca de las funciones.
Como ya sabes, todo en Python es un objeto .
Por ejemplo, cuando ejecutamos esta simple línea de código.
x = 5
Lo que realmente sucede es que estamos creando un objeto Python de tipo int que almacena el valor 5.
x es esencialmente un símbolo que se refiere a ese objeto.
Ahora verifiquemos el tipo de x y la dirección a la que se refiere.
Podemos hacerlo fácilmente usando el tipo y las funciones integradas de id .
>>> type(x)
<class 'int'>
>>> id(x)
4308964832
Como puede ver, x se refiere a un objeto de tipo int y este objeto vive en la dirección devuelta por la identificación
Cosas bastante sencillas.
Ahora, qué sucede cuando definimos una función como esta:
>>> def f(x):
...   return x * x
...
Repitamos el mismo ejercicio desde arriba e inspeccione el tipo de f y su id .
>>> def f(x):
...   return x * x
...
>>> type(f)
<class 'function'>
>>> id(f)
4316798080
hmm, muy interesante
Entonces resulta que hay una clase de función en Python y la función f que acabamos de definir es una instancia de esa clase.
Exactamente como x fue una instancia de la clase entera .
En otras palabras, literalmente puedes pensar en las funciones de la misma manera que piensas en las variables.
La única diferencia es que una variable almacena datos mientras que una función almacena código.
Eso también significa que puede pasar funciones como argumentos a otras funciones, o incluso hacer que una función sea el valor de retorno de otra función.
Veamos un ejemplo simple donde puedes pasar la función anterior f a otra función.
def f(x):
    return x * x

def modify_list(L, fn):
    for idx, v in enumerate(L):
        L[idx] = fn(v)

L = [1, 3, 2]
modify_list(L, f)
print(L)

#output: [1, 9, 4]
Tómese un minuto e intente comprender qué hace este código antes de seguir leyendo ...
Como puede ver, modify_list es una función que toma una lista L y una función fn como argumentos.
Luego itera sobre la lista elemento por elemento y aplica la función fn en cada uno.
Esta es una forma muy genérica de modificar los elementos de una lista, ya que le permite pasar la función responsable de la modificación que puede ser muy útil, como verá más adelante.
Entonces, por ejemplo, cuando pasamos la función f a modify_list , el resultado será que cada elemento de la lista estará al cuadrado.
Podríamos pasar cualquier otra función personalizada que pueda modificar la lista de cualquier manera arbitraria.
¡Eso es algo muy poderoso allí mismo!
Bien, ahora que he establecido algunas bases, hablemos de lambdas.
Un Python lambda es solo otro método para definir una función .
La sintaxis general de una Python lambda es:
argumentos lambda: expresión
Las funciones de Lambda pueden aceptar cero o másargumentos, pero  solo una expresión.
El valor de retorno de la función lambda es el valor con el que se evalúa esta expresión.
Por ejemplo, si queremos definir la misma función f que definimos antes de usar la sintaxis lambda, así es como se verá:
>>> f = lambda x: x * x
>>> type(f)
<class 'function'>
Pero puede que se pregunte por qué la necesidad de lambdas en primer lugar cuando podemos definir funciones de la manera tradicional.
¡Buena pregunta!
En realidad, las lambdas solo son útiles cuando quieres definir una función única.
En otras palabras, una función que se usará solo una vez en su programa. Estas funciones se denominan funciones anónimas.
Como verá más adelante, hay muchas situaciones en las que las funciones anónimas pueden ser útiles.

Lambdas con múltiples argumentos

Como viste anteriormente, fue fácil definir una función lambda con un argumento.
>>> f = lambda x: x * x
>>> f(5)
25
Pero si desea definir una función lambda que acepte más de un argumento, puede separar los argumentos de entrada por comas.
Por ejemplo, supongamos que queremos definir una lambda que tome dos argumentos enteros y devuelva su producto.
>>> f = lambda x, y: x * y
>>> f(5, 2)
10
¡Agradable!
¿Qué tal si quieres tener una lambda que no acepte ningún argumento?

Lambdas sin argumentos

Supongamos que desea definir una función lambda que no tome argumentos y devuelva True .
Puede lograr esto con el siguiente código.
>>> f = lambda: True
>>> f()
True

Lambdas multilínea

Sí, en algún momento de tu vida te preguntarás si puedes tener una función lambda con varias líneas.
Y la respuesta es:
No, no puedes 🙂
Las funciones lambda de Python aceptan solo una y solo una expresión.
Si su función tiene múltiples expresiones / declaraciones, es mejor que defina una función de la manera tradicional en lugar de usar lambdas.

Ejemplos de Lambda en acción

Ahora analicemos algunos de los lugares más comunes donde las pitón lambdas son muy utilizadas.

Usando lambdas con mapa

Una operación común que aplicará a las listas de Python es aplicar una operación a cada elemento.
Map es una función incorporada de Python que toma una función y una secuencia como argumentos y luego llama a la función de entrada en cada elemento de la secuencia.
Por ejemplo, suponga que tenemos una lista de enteros y queremos cuadrar cada elemento de la lista usando la función de mapa .
>>> L = [1, 2, 3, 4]
>>> list(map(lambda x: x**2, L))
[1, 4, 9, 16]
Tenga en cuenta que en Python3, la función de mapa devuelve un objeto Map mientras que en Python2 devuelve una lista .
Vea, en lugar de definir una función y luego pasarla al mapa como argumento, puede usar lambdas para definir rápidamente una función dentro del paréntesis del mapa.
Esto tiene sentido especialmente si no va a utilizar esta función nuevamente en su código.
Echemos un vistazo a otro caso en el que las lambdas pueden ser útiles.

Usando lambdas con filtro

Como su nombre lo indica, filter es otra función incorporada que realmente filtra una secuencia o cualquier objeto iterable.
En otras palabras, dado cualquier objeto iterable (como una lista), la función de filtro filtra algunos de los elementos mientras los mantiene según algunos criterios.
La persona que llama al filtro define este criterio al pasar una función como argumento.
Esta función se aplica a cada elemento del iterable.
Si el valor de retorno es True , el elemento se mantiene. De lo contrario, el elemento no se tiene en cuenta.
por ejemplo, definamos una función muy simple que devuelve True para números pares y False para números impares:
def even_fn(x):
  if x % 2 == 0:
    return True
  return False

print(list(filter(even_fn, [1, 3, 2, 5, 20, 21])))

#output: [2, 20]
Dicho esto, con la magia de las lambdas puedes hacer lo mismo de manera más sucinta.
El código anterior se transformará en esta línea.
print(list(filter(lambda x: x % 2 == 0, [1, 3, 2, 5, 20, 21])))
Y eso, amigo mío, es el poder de las lambdas .

Usar lambdas con clasificación de listas

Ordenar una lista de Python es una operación muy común.
De hecho, tengo un todo en profundidad artículo dedicado a este tema.
Si tiene una lista de números o cadenas, entonces ordenar una lista es muy sencillo.
Usted sólo puede usar el tipo o ordenados funciones incorporadas.
Sin embargo, a veces tiene una lista de objetos personalizados y es posible que desee ordenar la lista en función de un campo de objeto específico.
En este caso, puede pasar un parámetro clave opcional para ordenar o ordenar .
Este parámetro clave es en realidad de tipo función.
La función se aplica a todos los elementos de la lista y el valor de retorno es lo que se va a ordenar.
Pongamos un ejemplo.
Suponga que tiene una clase de empleado que se ve así
class Employee:
    def __init__(self, name, age):
        self.name = name
        self.age = age
Ahora creemos algunos objetos de empleado y anexémoslos a una lista.
Alex = Employee('Alex', 20)
Amanda = Employee('Amanda', 30)
David = Employee('David', 15)
L = [Alex, Amanda, David]
Ahora digamos que queremos ordenar esta lista en función de la edad de los empleados, esto es lo que debemos hacer:
L.sort(key=lambda x: x.age)
print([item.name for item in L])
# output: ['David', 'Alex', 'Amanda']
Vea cómo usamos una expresión lambda como parámetro clave en lugar de tener que definir una función externamente y luego pasar esta función para ordenar .

Una palabra sobre expresiones vs declaraciones

Como mencioné anteriormente, lambdas puede usar solo una expresión como el cuerpo de la función lambda.
Tenga en cuenta que no dije una declaración .
Las declaraciones y expresiones son dos cosas diferentes, pero pueden ser confusas, así que déjame tratar de aclarar las diferencias.
En los lenguajes de programación, una declaración es una línea de código que hace algo pero no se evalúa como un valor.
Por ejemplo, una declaración if , un ciclo for , un ciclo while, todos estos son ejemplos de declaraciones.
No puede simplemente reemplazar la declaración con un valor porque las declaraciones no se evalúan como un valor.
Las expresiones, por otro lado, se evalúan a un valor.
Puede reemplazar fácilmente todas las expresiones en sus programas con algunos valores y su programa funcionará correctamente.
Por ejemplo:
3 + 5 es una expresión que es evaluación para 8
10> 5 es una expresión que se evalúa como Verdadero
Verdadero y (5 <3) es una expresión que se evalúa como Falsa
El cuerpo de Lambda tiene que ser una expresión porque el valor de esta expresión es el valor de retorno de la función.
Asegúrese de recordar este punto cuando escriba su próxima función lambda 🙂

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas