<jupyter_start><jupyter_text>Parámetros *args y *kwargs en Python<jupyter_code># hasta ahora las funciones son
def nombre_f ():
    return 2
#si tenian argumentos
def nombre_f_args(arg1,arg2,arg3=5):
    return arg3
#que son parametros args se suelen poner args, aunque con poner el * es el mismo tipo de objeto (args) estretilla args podemos pasar todos los argumentos que queramos
def nombre_args(*args):
    print(type(args))
    print(args)

x=2
y=["g","h"]
nombre_args(x,y,9,"j") #permite guardar todos los argumentos que queramos con el argumento args

""" para el ejemplo de abajo saber que sum, suma todos los elemenots de la tupla"""
tupla=(2,3,4,5)
sum(tupla)
##*ARGS
#la logica se puede v er en este ejemplo
def realiza_suma_numeros(*args): 
    print(sum(args))
realiza_suma_numeros(2,3,45,65,775457,5)# en vez de poner todas las variables que queramos a, b ,c ,d etc ponemos asi y es mas facil
#si hay un argumento obligatorio
def realiza_suma_numeros(x,*args): 
    print("x:",x)
    print("*args:", args)
    print(sum(args))
realiza_suma_numeros(2,3,4,5,6,777) #x es el primero y args se devuelve en tupla siempre
#si solo hay un parametro, args es una tupla vacia
def realiza_suma_numeros(x,*args): 
    print("x:",x)
    print("*args:", args)
    print(sum(args))
realiza_suma_numeros(2)
realiza_suma_numeros(x=2,3,4) #esto da error xq todo lo que este a la derecha del primer igual todos tendrian que estar con el igual
realiza_suma_numeros(x=2,3,4)#limitacion de args, no podemos asignar ningun nombre de variables. Args es una tupla de todos los valores que no esten asociados a ningun argumento obligatorio
##**kwargs
def funcion_kwargs(**kwargs):
    print(type(kwargs))
    print(kwargs)

funcion_kwargs(2,3) # no permite llamar a la funcion sin pasar nombre a las variables, en args era al reves
def funcion_kwargs(**kwargs):
    print(type(kwargs))
    print(kwargs)

funcion_kwargs(p=2,x=3) #creamos claves y valores a un diccionario y es de tipo diccionario
def funcion_kwargs(x,**kwargs):
    print("x:",x)
    print(type(kwargs))
    print(kwargs)

funcion_kwargs(p=2,x=3) #x se pone el valor si o si, el resto a diccionario
def funcion_kwargs(x,b=4,**kwargs):
    print("x:",x)
    print("b",b)
    print(type(kwargs))
    print(kwargs)

funcion_kwargs(2,p=3, s=[3,4]) #va a contener todos los parametros que les asignes valor y que no esten en la funcion definidas, pues el p porque b esta definida y x tambien ya que el primer valor va a ser el 2. p no lo esta
funcion_kwargs(2,-1,p=3, s=[3,4])#el segundo valor lo recoge la variable b y cambia el valor.   IMPORTANTE LE VALOR QUE YO LE DOY AL LLAMAR LA FUNCION A UNA VARIABLE, TIENE MAS IMPORTANCIA QUE EL VALOR QUE TIENE PREASIGANDO ES DECIR -1 VA A B Y DA IGUAL QUE SEA
#*args & **kwargs
# si se utiliza *args y **kwargs se pone primero *args
def funcion_kwargs_args(x,b=4,*args,**kwargs):
    print("x:",x)
    print("b",b)
    print(type(args))
    print("*args:",args)
    print(type(kwargs))
    print("**kwargs:",kwargs)
funcion_kwargs_args(1) # si le doy un valor va al x

funcion_kwargs_args(x=1, k=2) # si le asigno un valor a una variable va a kwargs
#args no admite un nombre de variable, kwargs solo admite nombre de variable
funcion_kwargs_args(1,2,3) #el 3 va a args
funcion_kwargs_args(1,2,3, j=6)
funcion_kwargs_args(1, j=6)
funcion_kwargs_args(1,2,3,999, j=6)
d={5:"p"}
funcion_kwargs_args(1,2,3,999,d, j=6) #va a args la d porque no tiene variable asignada 
funcion_kwargs_args(1,2,3,999,d=d, j=6)# d es la key del diccionario y el valor de d es la clave
def funcion_kwargs_args(x,b=4,*args,**kwargs):
    print("x:",x)
    print("b",b)
    print(type(args))
    print("*args:",args)
    print(type(kwargs))
    print("**kwargs:",kwargs)
    print("kwargs:[d]", kwargs['d']) #asi apra mostrar el valor de la clave d de kwargs
funcion_kwargs_args(1,2,3,999,d=d, j=6)
#LA KEY DE KWARGS HA DE SER SIEMPRE STRING<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11596041613803604, 'fraction_numerical': 0.02588175589951789, 'mean_word_length': 5.009146341463414, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '574216', 'license': 'MIT', 'n_tokens_mistral': 1523, 'n_tokens_neox': 1461, 'n_words': 490, 'path': 'week4_EDA_np_pd_json_apis_regex/day1_numpy_pandas_I/theory/python/args_kwargs.ipynb', 'repo_name': 'PabloEduardoMartinezPicazo/Bootcamp-DataScience-2021', 'size': '3941'}