Python - funciones, argumentos y parámetros
En Python es posible pasar arumentos de diferntes maneras, en esta entrada muestro cómo pasar un arreglo de parámetros y cómo se comportan la variables que se pasan a una función dependiendo el ambito en el que se encuntran.
Algo sencillo pero de gran utilidad es pasar un arreglo de parámetros a una función.
Ejemplo 1:
1 2 3 4 5 | def promedio(*args): return sum(args)/len(args) print(promedio(2, 3, 4)) print(promedio(3,4,5,6,7)) |
Esto nos imprime como resultado 3.0 y 5.0. Lo importartante es notar que no especificamos el tipo de parámetros ni la cantidad, y nuestra función nos hace el calculo del promedio de un conjunto de números.
De esta manera podemos ingresar una cantidad dinámica de parámetros en nuestros programas.
Los lenguajes de programación utilizan principalmente dos maneras de pasar los valores a las funciones: Por referencia y por valor.
Pasar parámetros por referencia, significa que el objeto pude ser alterado dentro de la función.
Pasar parámetros por valor, significa que a la función se pasa una copia de los parámetros.
Python utiliza el paso de parámetros por referencia, por lo tanto debemos tener cuidado al pasar un objeto mutable.
Ejemplo 2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | x = 7 def acceso_global(): print('accediendo desde acceso_global(): ', x) acceso_global() def tratando_modificar_variable_global(): x = 3.5 print('accediendo desde tratando_modificar_variable_global(): ', x) tratando_modificar_variable_global() print(x) def modifiacando_variable_global(): global x x = 'Hola que tal?' print('accediendo desde modifiacando_variable_global(): ', x) modifiacando_variable_global() print(x) |
Como resultado imprime:
accediendo desde acceso_global(): 7
accediendo desde tratando_modificar_variable_global(): 3.5
7
accediendo desde modifiacando_variable_global(): Hola que tal?
Hola que tal?
Podemos ver que en la línea 6 la variable x, es tomada como una variable local. Python, crea una variable temporal, mientras se imprime en la línea 7, cuando se llama a la función en la línea 8.
Pero la varible global definida en la línea 1, no ha cambiado.
Para modificar una variable global, es necesario utilizar la palabra reservada "global" definir dicha variable. De esta manera se modifica la variable definida en la línea 1, y lo podemos comprobar después de llamar a la función "modifiacando_variable_global" e imprimir la variable "x".
Ejemplo 3:
Al definir una varible, esta guarda una referencia al espacio en memoria de dicha variable, si quisieramo ver el identificador de la variable, lo podemos llamar utilizando la función "id(x)".
1 2 3 4 5 6 7 8 9 10 11 | num = 2; def elevar_a_la_cuarta_potencia(numero): print('id(numero) antes de modificarla:', id(numero)) print('"num" equivale a "numero":', num is numero) numero = numero**4 print('id(numero) después de modificarla:', id(numero)) return numero elevar_a_la_cuarta_potencia(num) print('id(num):', id(num)) |
Como resultado imprime:
id(numero) antes de modificarla: 9079040
"num" equivale a "numero": True
id(numero) después de modificarla: 9079488
id(num): 9079040
La variable númerica num es inmutable. Al pasar a la función, tiene un identidad igual a 9079040, que no cambia, después de hacer el llamado a la función. Aunque en la línea 6, se asigna a una neuva variable, Python crea una referencia a otra variable y que tiene un tiempo de vida sólo durante el llamado al método, una vez termina el llamado, dicha variable es enviada al 'garbage collector' para liberar recursos.
Es importante conocer el paso por referencia y los ambitos de las variables(locales como globales), más aún cuando se envíen variables/objetos mutables a los métodos. Esto se asocia al principo de mínimo privilego y nos puede evitar problemas al codificar nuestros scripts.
Comentarios
Publicar un comentario