# Argumentos de funciones **Parametros** : son las variables definidas o usadas entre parentesis al momento de definir una función. **Argumentos** : son los valores pasados para estos parametros cuando se llama una función. - Argumentos posicionales y palabras clave (positionals & keyword args) - Argumentos por defecto - Argumentos de largo variable (\*args y \*\*kwargs) - Desmepaquetamiento de contenedor en argumentos de función - Argumentos locales y globales - Parametro 'de paso' o 'pasajero' Ejemplos: - [Argumentos de funciones](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/18_function_arguments#tipos-de-argumentos-de-funciones) - [Desempaquetando argumentos](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/18_function_arguments#desempaquetando-argumentos) - [Variables globales y locales](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/18_function_arguments#variables-globales-y-locales) - [Paso de parametros](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/18_function_arguments#paso-de-parametros) ---- ## Tipos de Argumentos de funciones - argumento posicional - multiples argumentos - argumento par clave-valor (keyword) #### Argumento básico ```python def print_nombre(nombre): print(nombre) print_nombre('Juen') # Juen ``` #### Argumentos posicionales ```python def foo(a, b, c): print(a, b, c) foo(1,2,3) # 1 2 3 foo(c=1, b=2, a=3) # 3 2 1 foo(1, b=2, c=3) # 1 2 3 # foo(1, b=2, 3) # SyntaxError: # positional argument follows keyword argument def boo(a, b, c, d=4): print(a, b, c, d) boo(1, 2, 3, 7) # 1 2 3 7 boo(1,3,5, d=6) # 1 3 5 6 boo(5, 4, 2) # 5 4 3 4 def koo(a, b, *args, **kwargs): # posicional print('argumentos:') print(a, b) # multiples print('*args:') for arg in args: print(arg) # par clave=valor print('*kwargs:') for key in kwargs: print(key, kwargs[key]) koo(1, 2, 3, 4, 5, seis=6, siete=7) # argumentos: # 1 2 # *args: # 3 # 4 # 5 # *kwargs: # seis 6 # siete 7 # Forzar el uso de argumento 'keyword' en funciones # los argumentos que siguen del '*' deben ser 'keyword' def loo(a, b , *, c, d): print(a, b, c, d) loo(1, 2, c=3, d=4) # 1 2 3 4 def loo(*args, ultimo): for arg in args: print(arg) print(ultimo) loo(1, 2, ultimo=16) # 1 # 2 # 16 ``` #### Desempaquetando argumentos ```python def foo(a, b, c,): print(a, b, c) mi_lista = [0, 1, 2] #mi_lista = (0, 1, 2) # desempaquetar lista, tupla en el llamado a la función foo(*mi_lista) # 0 1 2 mi_dic = {'a':1, 'b':2, 'c':3} foo(**mi_dic) # 1 2 3 ``` ## Variables globales y locales ```python def foo(): global numero x = numero print('numero dentro de la función :', x) # cambio en variable global dentro de función numero = 3 def boo(): # variable local numero = 6 print('numero dentro de la función :', numero) #global numero numero = 5 foo() print("numero fuera:",numero) boo() print("numero fuera:",numero) ``` ## Paso de Parametros Los parametros pasados son una referencia a un Objeto, esta referencia es pasada como valor. Existen diferencias entre tipos de dato mutables e inmutables, es decir, objetos como listas o diccionarios pueden ser modificados en un metodo, pero si se reasigna la referencia en el metodo, entonces la referencia fuera de este sigue apuntando al objeto original (no cambia). - Objetos mutables pueden cambiar - Objetos inmutables no pueden cambiar - Objetos mutables dentro de objetos inmutables pueden cambiar ```python def foo(x): x = 5 # inmutable var = 10 foo(var) print(var) def boo(una_lista): una_lista.append(5) # mutable lista = [1,2,4] boo(lista) print(lista) ```