Anuncios

Bienvenidos sean a este post, hoy comenzaremos a profundizar en un tema que vimos muy superficialmente en posts anteriores.

Anuncios

Pero que es una funcion? Podemos definirlo de la siguiente manera:

Una funcion es una secuencia de instrucciones que ejecutan una tarea todas agrupadas como una unidad

El Tinchicus
Anuncios

Uno de los motivos principales para utilizar funciones es la reduccion de la duplicidad de codigo, uno de los principales problemas que debemos evitar, porque tener que repetir una parte del codigo cada vez que sea necesaria si podemos crear una funcion y llamarla cada vez que la necesitamos, si vienen de los posts anteriores hemos visto algunos ejemplos donde usabamos una funcion para repetir determinadas tareas, otra buena practica del uso de funciones es para segmentar una tarea muy compleja, veamos la siguiente funcion de ejemplo:

de hacer_report(origen) :
    # Recuperar y preparar datos
    datos = recuperar_datos(origen)
    datos_analizados = analizar_datos(datos)
    datos_filtrados = filtrar_datos(datos_analizados)
    datos_listos = preparar_datos(datos_filtrados)

    # ejecutar algoritmos sobre datos
    datos_finales = analizar(datos_filtrados)

    # crear y devolver reporte
    reporte = Reporte(datos_finales)
    return reporte
Anuncios
Anuncios

Vamos a tener una funcion de orden ficticio con otras que tambien estaran definidas, la funcion de ejemplo (hacer_reporte) recibe una informacion en origen, a esta informacion no solo la recuperamos desde el origen informado que puede ser un archivo, un servidor, una interfaz de entrada, etc sino que tambien la preparemos por medio de otras funciones que se encargaran de analizarla, filtrarla y prepararla con esto concluimos la primera parte, en la segunda parte analizaremos la informacion preparada por medio de algunos algoritmos para finalizar la misma, por ultimo con los datos finales creados vamos a generar un reporte por medio de la funcion Reporte y los datos finales antes obtenidos y finalmente enviar este reporte, puede parecer complejo y dificil pero con todo esto nos garantizamos que si ocurre algun error con el reporte solamente debemos analizar esta funcion y no todo el codigo.

Anuncios
Anuncios

Otra de las ventajas de este tipo de implementaciones es el ocultar detalles del codigo porque como dijimos antes podemos generar modulos dentro de paquetes para luego ser importados, en algunos ejemplos anteriores hemos importado funciones para hacer tareas sin necesidad de tener que generar el codigo para poder hacer la misma tarea, tambien mejora la lectura de nuestros codigos porque al usar funciones estructuramos las partes que hacen cada una gracias a la identificacion de la funcion, a su vez esto nos permite tener un buen rastro de nuestras acciones porque en caso de error podemos pasar a ver cada una de las mismas y verificar si ha ocurrido un error o porque no hace lo que deberia hacer.

Anuncios

Rangos

Cuando hablamos de los alcances o rangos en este post dijimos que podian ser locales o globales pero tienen mas opciones, bueh no mucho mas, que nos permiten delimitar perfectamente a nuestras variables, pasemos a crear un archivo con el siguiente codigo:

rangos.py

def mi_funcion() :
	variable = 1
	print('mi_funcion:', variable)

variable = 0
mi_funcion()
print('Global:', variable)
Anuncios

Primero definiremos una funcion llamada mi_funcion, esta posee un nombre llamado variable con el valor de 1, luego la mostraremos informando desde donde la tomamos, por fuera de esta funcion definimos un nombre con la misma identificacion pero con otro valor, despues llamamos a la funcion anterior para despues imprimir el valor de nuestro nombre global, probemos para ver su salida:

tinchicus@dbn001vrt:~/python$ python3 rangos.py 
mi_funcion: 1
Global: 0
tinchicus@dbn001vrt:~/python$
Anuncios

Hasta aca tenemos la misma situacion que explicamos anteriormente en este post, con este mismo codigo vamos a realizar un par de modificaciones:

def mi_funcion() :
	variable = 1
	def mi_funcion_interna() :
		variable = 2
		print('mi_funcion_interna:', variable)
	
	mi_funcion_interna()
	print('mi_funcion:', variable)

variable = 0
mi_funcion()
print('Global:', variable)
Anuncios

En esta ocasion a nuestra funcion anterior le agregamos una funcion interna llamada mi_funcion_interna despues de definir a variable y en esta definimos un nuevo valor para variable y la mostramos en pantalla, luego la llamamos y por ultimo mostramos el valor de variable en mi_funcion, el resto sigue igual que antes, ejecutemos y veamos que sucede:

tinchicus@dbn001vrt:~/python$ python3 rangos.py 
mi_funcion_interna: 2
mi_funcion: 1
Global: 0
tinchicus@dbn001vrt:~/python$
Anuncios

El valor de la variable dentro de la nueva funcion no afecta a la anterior porque esta como dijimos anteriormente solamente existe dentro de ese bloque y no en el resto pero esta nueva funcion tambien es local de la funcion que la contiene si intentamos llamarla desde fuera no tendremos exito, pasemos a modificar nuestro codigo de la siguiente manera:

def mi_funcion() :
	variable = 1
	def mi_funcion_interna() :
		nonlocal variable
		variable = 2
		print('mi_funcion_interna:', variable)

	mi_funcion_interna()
	print('mi_funcion:', variable)

variable = 0
mi_funcion()
print('Global:', variable)
Anuncios

En este caso la unica variacion que hicimos fue modificar al nombre de mi_funcion_interna como nonlocal, el resto lo dejamos como estaba antes, probemos y veamos como funciona:

tinchicus@dbn001vrt:~/python$ python3 rangos.py 
mi_funcion_interna: 2
mi_funcion: 2
Global: 0
tinchicus@dbn001vrt:~/python$
Anuncios

Si observamos ahora nuestro nombre de mi_funcion sufrio una modificacion y tomo el valor que establecimos en mi_funcion_interna, esto es debido a que nonlocal une al nombre de una funcion interna con la contenedora pero esto solo funciona con rangos encapsulados excluyendo a las globales, es decir que si nosotros intentamos esto con mi_funcion nos devolvera un error, modifiquemos el codigo nuevamente de la siguiente forma:

def mi_funcion() :
	variable = 1
	def mi_funcion_interna() :
		global variable
		variable = 2
		print('mi_funcion_interna:', variable)

	mi_funcion_interna()
	print('mi_funcion:', variable)

variable = 0
mi_funcion()
print('Global:', variable)
Anuncios

En este codigo la unica modificacion que hicimos es cambiar a nonlocal por global, esta trabaja de la misma forma pero en lugar de unir a la funcion que lo contiene lo hace con la variable global, probemos y veamos que sucede:

tinchicus@dbn001vrt:~/python$ python3 rangos.py 
mi_funcion_interna: 2
mi_funcion: 1
Global: 2
tinchicus@dbn001vrt:~/python$
Anuncios

Como pueden ver ahora esta modificacion se cambio al valor de la variable global, esta al igual que nonlocal solamente funciona con las funciones que estan encapsuladas en otras funciones, con esto terminamos una introduccion basica sobre funciones y sus alcances.

Anuncios

En resumen, hoy hemos visto, que es una funcion, en que nos ayuda, porque es util aplicarlas, tambien hemos vuelto a hablar sobre los alcances de las mismas y como podemos afectar a los mismos con atributos especificos, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.00