Argumentos indefinidos

 

Argumentos indefinidos

Como vimos anteriormente a las funciones definidas por el usuario se le pueden pasar valores a los parámetros, estos valores se conocen como argumentos. Es muy común conocer la cantidad de argumentos que se necesitan pasar a una función para realizar su tarea, pero existen casos en los cuales la cantidad de argumentos pueden variar o directamente no se sabe cuantos argumentos se necesitan pasar. Por ejemplo para pasarle a una función que calcule el promedio de notas de los alumnos de un curso se pueden y deben saber las notas de los alumnos, pero la cantidad de alumnos puede variar de un curso a otro y no resulta práctico tener que reescribir la función para programar nuevamente la cantidad de parámetros que admita dependiendo del numero de alumnos en ese curso en particular. Para resolver esto en Python se utiliza la sintaxis especial *ARGS, las cual se usa exactamente para pasar múltiples argumentos a una función de manera indefinida. Cabe mencionar que los argumentos indefinidos se colocan al final de los parámetros de la función, es decir, si la función va a recibir parámetros específicos, estos deben ir antes de *ARGS.

Veamos el siguiente ejemplo:

import os
os.system("cls")

def Sumar(*args):
    iTotalSuma=0
    for x in args:
        iTotalSuma+=x
    return iTotalSuma

print(f'La suma total es: {Sumar(15,35,24,26)}')
print(f'La suma total es: {Sumar(15,26)}')
print(f'La suma total es: {Sumar(15,35,24,26,23,35,53,11,513,2,5)}')

Resultado:

La suma total es: 100
La suma total es: 41
La suma total es: 742

Como podemos comprobar por el resultado de la ejecución del código anterior, la función Sumar admite un número indeterminado de argumentos. Es importante mencionar que el objeto args pertenece a la clase TUPLA. Si lo pasamos como argumento a la función TYPE, Python devolverá su tipo confirmando lo dicho anteriormente.

import os
os.system("cls")

def Sumar(*args):
    print(f'El objeto args es del tipo {type(args)}')
    iTotalSuma=0
    for x in args:
        iTotalSuma+=x
    return iTotalSuma
print(f'La suma total es: {Sumar(15,35,24,26)}')
print(f'La suma total es: {Sumar(15,26)}')
print(f'La suma total es: {Sumar(15,35,24,26,23,35,53,11,513,2,5)}')

Resultado:

El objeto args es del tipo <class 'tuple'>
La suma total es: 100
El objeto args es del tipo <class 'tuple'>
La suma total es: 41
El objeto args es del tipo <class 'tuple'>
La suma total es: 742

Hay que mencionar que no es necesariamente obligatorio el uso de la sintaxis args, en realidad se puede usar cualquier palabra y Python creará un objeto tipo tupla con ese identificador. Veamos el siguiente ejemplo:

import os
os.system("cls")

def Sumar(*tupla):
    iTotalSuma=0
    for x in tupla:
        iTotalSuma+=x
    return iTotalSuma
print(f'La suma total es: {Sumar(15,35,24,26,23,35,53,11,513,2,5)}')

Resultado:

La suma total es: 742

Como podemos ver cambiando la sintaxis también funciona, lo importante es que antes del nombre del parámetro se encuentre el operador de desempaquetamiento "*" o "**". Conviene mencionar en este momento que el operador de desempaquetamiento "*" y "**". Devuelven el contenido del objeto iterable al que anteceden. Veamos el mismo ejemplo que que venimos trabajando y agregándole na funcionalidad adicional para que muestre por pantalla los elementos que se estan sumando:

import os
os.system("cls")

def Sumar(*tupla):
    iTotalSuma=0
    print('Sumando los siguientes elementos:')
    print(*tupla)
    for x in tupla:
        iTotalSuma+=x    
    return iTotalSuma
print(f'La suma total es: {Sumar(15,35,24,26,23,35,53,11,513,2,5)}')

Resultado:

Sumando los siguientes elementos:
15 35 24 26 23 35 53 11 513 2 5
La suma total es: 742

Como podemos comprobar el operador de desempaquetado ha hecho justamente eso, desempaquetar los elementos individuales contenidos en la tupla de datos enviada a la función Sumar.

Nota: a pesar de que como ya vimos es posible asignarle otro identificador a la tupla contenedora de los argumentos recibidos en una función, por convención o por tradición y para mantener una buena práctica de programación, de aquí en adelante siempre se usará el identificador args.

Argumentos indefinidos con nombre

Como ya vimos anteriormente las funciones en Python pueden aceptar argumentos indefinidos a traves de un parámetro tipo tupla que es desempaquetado a través del operador *. Sin embargo, en caso de ser necesario recibir como argumento una objeto iterable de elementos con clave, como por ejemplo del tipo diccionario, las funciones también pueden procesarlas a través del operador de desempaquetado de de argumentos nombrados. Para ello nos valdremos de la sintaxis especial **KWARGS. Al igual que en la sintaxis ARGS, este identificador puede ser cambiado por cualquier otro, sin embargo vamos a mantener la tradición y usaremos el identificador kwargs como parámetro de recepción de datos nombrados o con clave en la función. Veamos el siguiente ejemplo para aclararlo un poco:

import os
os.system('cls')

def diccionario(**kwargs):

    print(f'La función ha recibido un objeto {type(kwargs)} para procesar')
     
    indices=''
    valores=''

    for x in kwargs.values():
        valores+=x+' '
    for x in kwargs.keys():
        indices+=x+' '
    indices = 'Los indices recibidos fueron: ' + indices
    valores='Los valores recibidos fueron: ' + valores
    return indices, valores
print(diccionario(ene="Enero",feb="Febrero",mar="Marzo"))


Resultado:

('Los indices recibidos fueron: ene feb mar ', 'Los valores recibidos fueron:
Enero Febrero Marzo ')

Como podemos comprobar la función diccionario muestra la clase a la que pertenece el objeto recibido en su parámetro kwargs y lo desempaqueta a través del operador de desempaquetamiento de objetos iterables indexados (**) para luego procesarlo como un objeto tipo diccionario.

Comentarios

Entradas populares