Este artículo ayudará al lector a continuar desde el blog anterior sobre funciones de Python junto con algunas aplicaciones básicas en el mundo real. Estaremos utilizando Visual Studio Code como nuestro editor de código. Si no has instalado Visual Studio Code, las instrucciones se dan en el primer blog.

Funciones avanzadas en Python – tabla de contenido:

  1. Pasar funciones a otras funciones
  2. Usar funciones dentro de una función
  3. *Args en Python
  4. Operador “*” en Python
  5. **kwargs en Python

Pasar funciones a otras funciones

Como se discutió en el blog anterior, las funciones en Python se tratan como objetos. Así que, al igual que los objetos en Python, las funciones también pueden ser pasadas como un argumento a otra función.

Por ejemplo:

def mul(x, y):
    return x*y
 
 
def add(mul, y):
    return mul+y
 
 
x = add(mul(9, 10), 10)
print(x)

En el bloque de código anterior, se puede ver que la función mul se pasa como un argumento a la función add y se almacena en la variable x, que luego se imprime para verificar la respuesta.

100

Usar funciones dentro de una función

En Python, podemos definir una función dentro de otra función. Estas funciones se llaman funciones anidadas. Pero en este caso de uso, la función interna o función anidada no puede ser llamada por separado. Ambos ejemplos se ilustran en el siguiente bloque de código.

Escribamos nuestra primera función.

def mul(x, y):
 
    m = x*y
 
    def square(m):
        return m*m
 
    return square(m)
 
 
x = mul(9, 10)
 
print(x)
Salida:
8100

En el bloque de código anterior, la función externa es “mul” que devuelve la función square que toma un argumento “m” que es la multiplicación de dos argumentos dados a la función “mul”. La ejecución del código comienza primero llamando a la función “mul”, luego el producto de “x” y “y” se almacena en la variable “m”. Como esta función está devolviendo la función square, se llama a la función “square” y se devuelve el producto final que es el cuadrado de “m”.

Aprendamos algunas cosas importantes en Python, que harán que tu viaje de codificación con Python sea mucho mejor.

*Args en Python

Estos son los argumentos que usamos como parámetros de función. Escribamos una función habitual usando lo que hemos aprendido hasta ahora. Estaremos escribiendo una función que puede darnos el área máxima de un rectángulo dados 2 áreas de rectángulos como parámetros a la función.

def maxarea(a, b):
    if a > b:
        return f'el rectángulo a tiene más área que es {a}'
    else:
        return f'el rectángulo a tiene más área que es {b}'
 
 
x = maxarea(100, 60)
print(x)
 
Salida:
el rectángulo a tiene más área que es 100

Esta función es buena para 2 parámetros o argumentos, pero ¿qué pasa si necesitamos comparar más de 2 áreas? Un enfoque sería pasar una lista de áreas a la función.

def maxarea(lis):
 
    max = 0
    for i in lis:
        if i > max:
            max = i
 
    return f"el rectángulo que tiene más área es {max}"
 
 
x = maxarea([100, 60, 50])
print(x)
Salida:
el rectángulo que tiene más área es 100

Este enfoque es bueno, pero deberíamos saber el número de parámetros o argumentos a dar de antemano. En la ejecución de código en tiempo real, esto sería un inconveniente. Por lo tanto, para facilitar la vida del programador, Python utiliza *args y **kwargs.

Operador “*” en Python

Este operador es un operador de desempaquetado que se utiliza generalmente para pasar un número no especificado de parámetros o argumentos.

Desempaquetando argumentos en una tupla usando el operador *

Como hemos visto, el operador “*” se utiliza para desempaquetar valores. El ejemplo se ilustra a continuación.


x = [1, 2, 3, 4]
y = [5, 6, 7, 8]
 
z = *x, *y
 
print(type(z))
print(z)
Salida:
<class 'tuple'>
(1, 2, 3, 4, 5, 6, 7, 8)

Como podemos ver, el operador de desempaquetado ha desempaquetado la lista x y la lista y en la tupla que es z. También podemos ver que el resultado es una tupla.

Escribamos la misma función usando *Args.

def maxarea(*lis):
 
    max = 0
    for i in lis:
        if i > max:
            max = i
 
    return f"el rectángulo que tiene más área es {max}"
 
 
x = maxarea(100, 60, 50, 200)
y = maxarea(100, 60, 50, 200, 9000)
z = maxarea(100, 60, 50, 20, 90)
print(x)
print(y)
print(z)
Salida:
el rectángulo que tiene más área es 200
el rectángulo que tiene más área es 9000
el rectángulo que tiene más área es 100

En este bloque de código, podemos ver que ahora los argumentos son dinámicos, podemos agregar cualquier número de argumentos que serán desempaquetados en la función maxarea para darnos el resultado deseado. Además, podemos comparar cualquier número de áreas en este contexto.

**kwargs en Python

Los kwargs son como args, pero aceptan argumentos posicionales. Utiliza el operador ** que tiene algunos atributos como desempaquetar múltiples argumentos posicionales de cualquier longitud, también puede desempaquetar diccionarios, también se puede usar para combinar dos diccionarios.

Fusionando diccionarios

a = {"h": 1, "n": 2}
b = {"m": 5, "l": 10}
 
c = {**a, **b}
 
print(type(c))
print(c)
 

Podemos ver en el código anterior que tenemos 2 diccionarios a y b que se fusionan usando el operador ** para dar otro diccionario.
Salida:
 
<class 'dict'>
{'h': 1, 'n': 2, 'm': 5, 'l': 10}

Cuando usamos el operador * en lugar del operador **, el código para este caso se ilustra a continuación.

a = {"h": 1, "n": 2}
b = {"m": 5, "l": 10}
 
c = {*a, *b}
 
print(type(c))
print(c)
Salida:
<class 'set'>
{'n', 'l', 'm', 'h'}

Por lo tanto, cuando se utiliza el operador * en dos diccionarios para fusionar, el resultado será un conjunto con solo las claves del diccionario.

La función maxarea usando **kwargs se ilustra en el siguiente bloque de código.

def maxarea(**lis):
 
    max = 0
    for i in lis.values():
        if i > max:
            max = i
 
    return f"el rectángulo que tiene más área es {max}"
 
 
x = maxarea(a=1, b=2, c=3)
y = maxarea(a=1, b=2)
z = maxarea(a=1, b=2, c=3, d=9)
print(x)
print(y)
print(z)
Salida: el rectángulo que tiene más área es 3 el rectángulo que tiene más área es 2 el rectángulo que tiene más área es 9 [/code>

En este blog sobre funciones avanzadas en Python, hemos cubierto temas como pasar funciones a otras funciones, usar funciones dentro de una función, *Args en Python, operador “*” en Python, **kwargs en Python, y más. Los temas posteriores que incluyen clases se cubrirán en el próximo blog. La tarea sobre funciones avanzadas en Python se da a continuación.

advanced_functions_in_Python

Agnieszka Markowska-Szmaj

View all posts →