Veamos un ejemplo de cómo se implementa un programa separando la interfaz de usuario de la lógica del programa. Queremos crear un programa que permita realizar conversiones de divisas, específicamente de dólares estadounidenses a pesos colombianos y viceversa. Para llegar a nuestra solución, crearemos dos archivos, el primero contendrá las funciones encargadas de realizar las conversiones, es decir, el archivo que contendrá la lógica del programa; y un segundo encargado de interactuar con el usuario, solicitándole la información necesaria y presentando los resultados; esta será nuestra interfaz de usuario. En nuestro módulo de lógica tendremos que incluir entonces dos funciones: una que nos permita convertir de pesos a dólares y otra de dólares a pesos. Para las conversiones necesitaremos el monto de dinero a convertir y la tasa representativa del mercado o TRM, que nos indica el promedio diario de la tasa de cambio entre las divisas. Estos datos serán los parámetros de nuestras funciones. Pasemos a la implementación en Spyder. Empezamos creando la función que convierte de pesos a dólares, nos queda: def convertir_a_dólares, pesos de tipo float será el primer parámetro y el segundo la trm, también de tipo float. La función nos retorna, igualmente, un float. Para la conversión, debemos dividir la cantidad en pesos entre la trm, así que hacemos la operación y retornamos de una vez. Nos queda: return pesos dividido trm. Ahora, con nuestra segunda función: def convertir_ a_ pesos, que recibirá la cantidad en dólares, también de tipo float y la trm, nuevamente. Nos retorna, igualmente, un float. En este caso, la conversión será multiplicar la cantidad en dólares por la trm, quedando return dólares por trm. Ya con esto nos quedan nuestras funciones y por ende, nuestro módulo de lógica. Podemos proceder, ahora, a la interfaz de usuario. En la interfaz es donde interactuamos con el usuario, pidiendo las entradas necesarias para ejecutar el programa y mostrando los resultados de ejecución. En este caso, las entradas que debemos solicitar al usuario serán la TRM y la cantidad de dólares o pesos y la salida será la cantidad equivalente en dólares o pesos tras realizar la conversión que corresponda. Como el encargado de realizar las conversiones es el módulo de lógica, tenemos que importarlo en nuestra interfaz para poder invocar sus funciones. Esto lo logramos usando la instrucción "import", como veremos más adelante. Es posible darle un nombre a nuestro módulo dentro de la interfaz al momento de importarlo, usando la instrucción "as" para poder referenciarlo más fácilmente en el código; lo ideal es utilizar nombres cortos. A través de esta referencia, podremos invocar las funciones que el módulo contiene. Veamos la implementación, ahora sí, en Spyder. Iniciamos importando nuestro módulo: import librería as lb. Notemos que se importa el archivo sin incluir la extensión punto py y que usábamos el nombre lb para referirnos a este más fácilmente. Ahora, vamos a crear la función que nos permite ejecutar la conversión de pesos a dólares. Creamos: def ejecutar_convertir_a_doláres que recibe la trm de tipo float y retorna None. Recibimos la trm por parámetro para solo tener que solicitarla una vez al usuario, en unos instantes veremos cómo. Y la función no va a retornar nada, ya que su tarea es presentar el resultado de la conversión al usuario. Luego, solicitamos al usuario la cantidad a convertir: sería pesos es igual, que una vez convertimos a float, el input en el que pedimos al usuario que ingrese la cantidad de pesos. Seguido a esto, realizamos la conversión invocando la función de nuestro módulo: dólares va a ser igual a lb, que es nuestro módulo, punto convertir_a_dólares. Le pasamos por parámetro la cantidad en pesos y la trm. Finalmente, presentamos al usuario el resultado con un print. Vamos a mostrar que la cantidad en pesos, pesos son..., hacemos un round para que solamente se muestre la cantidad en dólares a dos decimales, y finalizamos mostrando el mensaje con dólares. La función que permite convertir de dólares a pesos será muy similar. Así que la copiaré y realizaremos las modificaciones necesarias. Copiamos nuestra función, pegamos y modificamos lo necesario. En este caso será convertir_a_pesos. Igual, necesitaremos la trm, no tendremos retorno; y esta vez solicitamos al usuario la cantidad en dólares, modificamos para que ingrese la cantidad en dólares, y lo que hacemos es solicitar a nuestro módulo que convierta los dólares a pesos. Ponemos, ahora, la función convertir_ a_ pesos, que recibirás de parámetro la cantidad en dólares y nuestra trm. Finalmente, indicaremos que la cantidad en dólares; aquí también cambiamos dólares, haremos simplemente un redondeo a entero de la cantidad de pesos, e incluimos que son aquí esa cantidad en pesos. Para poder ejecutar nuestro programa, crearemos la función: iniciar_aplicación en la que determinamos qué ejecutar al momento de correr del programa. Nos queda def iniciar_aplicación sin parámetros y sin retorno. En esta, solicitamos primero la trm al usuario. Diremos: trm es igual, y una vez a segunda conversión a float, del input en el que pedimos al usuario que ingrese la trm. Posteriormente, invocamos nuestras funciones "ejecutar" para permitir al usuario realizar las conversiones. Nos queda: ejecutar convertir_a_dólares, en el que pasamos como parámetro nuestra trm y nos quedará también el ejecutar convertir_a_pesos, que también recibirá como parámetro nuestra trm. Finalmente, incluimos un cuarto programa principal en el que invocamos a iniciar_aplicación. Iniciar_aplicación, recordemos siempre los paréntesis, para que se pueda iniciar con la ejecución. Ejecutemos nuestro programa y hagamos algunas pruebas. Corremos la interfaz y aquí podemos ver que nos solicita la trm, ingresaré 3.500; después, la cantidad en pesos, probemos con 175.000. Veamos que, efectivamente, nos dice que son 50 dólares. Ya vemos una prueba con otra cantidad en dólares. Supongamos, por ejemplo, que probamos cuántos son 120 dólares. Y obtenemos aquí que 120 dólares serían 420.000 pesos. En la solución que tenemos hasta el momento, el usuario tendrá que realizar ambas conversiones así no lo desee, ya que no contamos aún con los mecanismos de toma de decisiones. Sin embargo, cuando veamos estos mecanismos en el curso, podremos plantear una solución como las que se muestra en la imagen, en la que modificamos nuestra interfaz para incluir un menú que permita al usuario escoger la conversión que desea realizar y el programa estará en capacidad de determinar la opción elegida y ejecutar la función correspondiente. Eventualmente, podremos llegar, además, a permitir que tras el usuario ejecutar una conversión, el programa no termine, sino que permita seguir al usuario utilizándolo hasta que decida salir del programa. Esto lo lograremos con las instrucciones iterativas que estudiaremos más adelante. Y la solución utilizando este tipo de instrucciones, la podemos ver en la imagen. De ahora en adelante, organizaremos siempre nuestros programas utilizando la división entre lógica e interfaz que acabamos de revisar.