Calcula tu zodiaco con Python
Hola de nuevo. En esta entrega vamos a escribir un programa que con el mes y el día de nacimiento calcule el signo del zodíaco correspondiente. Tranquilo, no voy a hablar de temas de astrología ni de nada por el estilo, se trata de un ejemplo para ilustrar cómo introducir datos a nuestro programa, las sentencias condicionales y el uso de tuplas.
La entrada de datos en nuestro programa la efectuamos con la instrucción raw_input(). Su uso es el siguiente:
dia = raw_input("Escribe el día:")
En la consola aparecerá el texto que le pasamos a la función y esperará a que el usuario teclee algo y pulse la tecla enter. El contenido tecleado se almacena en la variable dia en formato texto. Si lo que necesitamos es convertir el contenido a un número, en este caso a un entero, podemos hacer el proceso después:
dia = raw_input("Escribe el día:") dia = int(dia) O también podemos hacerlo todo de una vez. Así podemos pedir el día y el mes y almacenarlos en las variables correspondientes: dia = int(raw_input("Escribe el día:")) mes = int(raw_input("Escribe el mes:"))
Aunque este tipo de simplificaciones siempre está reñida con la legibilidad, creo que en algunos casos (como éste) el programa queda suficientemente claro.
Ahora que tenemos los datos, lo siguiente es tener en cuenta cómo funciona el zodíaco. Tiene doce signos, que se corresponden más o menos con los doce meses del año. Lo que ocurre es que no ocupan meses completos, sino que un signo termina, y empieza el siguiente entre el 19 y el 22 de cada mes, algo que varía de unos meses a otros. Te remito a cualquier referencia externa para saber qué día empieza cada uno de los signos y si tienes más curiosidad el porqué.
Necesitarás usa una sentencia condicional, para comprobar si el día y el mes indicado están dentro del rango de un signo o no. ¿Cómo funcionan las sentencias condicionales?
if fruta == 'manzana': precio = 0.55 elif fruta == 'plátano': precio = 0.75 elif fruta == 'naranja': precio = 0.80 else: print ('No tenemos ' + fruta)
En este ejemplo comprobamos si la variable fruta contiene la cadena 'manzana'. Si es así asignamos a la variable precio el valor 0.55, si no, comprobamos si el contenido de fruta es 'plátano'. Si es así asignamos a precio el valor 0.75 y así sucesivamente. En caso de que ninguna de las comparaciones se cumpla, entonces (else:) mostraremos el texto 'No tenemos x' dónde x es el contenido de la variable fruta. Fíjate que para saber qué instrucciones hay que ejecutar en caso de que se cumpla alguna de las condiciones, las líneas de programa están indentadas, es decir tienen cuatro espacios antes de la instrucción. El número de espacios es indiferente, pero debe respetarse para todas las instrucciones de un mismo nivel. Lo habitual es utilizar el tabulador para establecer estos niveles y ajustar cuatro espacios como espacio por defecto. Si quieres ejecutar más de una instrucción en caso de que fruta=='manzana' tendrás que poner todas las instrucciones al mismo nivel. Fíjate también en los dos puntos que indican que va a empezar un conjunto de instrucciones que van a llevar un tabulador más que el nivel actual. En la condición se pueden agrupar diferentes operaciones de comparación junto con operadores lógicos, siempre que el resultado sea un boolean.
Vayamos a nuestro ejemplo, para el signo aries que va del 21/3 al 20/4 escribiré:
if ((mes==3) and (dia>=21)) or ((mes==4) and (dia<=20)): signo = 'aries'
Puedo ir escribiendo funciones if: una detrás de otra para comprobar cada uno de los signos, o usar elif: para que cuando se cumpla una de ellas, ya no se ejecuten las demás.
Con esto estaría solucionado el problema, pero vamos a ver una forma más elegante de completar el programa usando tuplas. Este sería el listado completo:
# -*- coding: utf-8 -*- # # programa para calcular el signo del zodiaco a partir de la fecha # signo = ("capricornio", "acuario", "piscis", "aries", "tauro", "géminis", "cáncer", "leo", "virgo", "libra", "escorpio", "sagitario") fechas = (20, 19, 20, 20, 21, 21, 22, 22, 22, 22, 22, 21) dia=int(raw_input("dia :")) mes=int(raw_input("mes :")) mes=mes-1 if dia>fechas[mes]: mes=mes+1 if mes==12: mes=0 print ("Tu signo es: " + signo[mes])
El programa crea primero dos listas, una con los signos del zodíaco referidos a los meses que principalmente ocupan, y otra con los días en los que terminan y empieza el siguiente. Para un mes dado, primer le restamos uno y comprobamos si el día sobrepasa el correspondiente al mes. Si es así, sumamos uno y si no se queda como está. A partir de ahí usando el mes en la tupla signo me devolverá el signo correcto, con una pequeña corrección. Los índices de la tupla, que tiene doce elementos van del 0 al 11, así que en el caso de que mes valga doce, le asigno el valor cero, lo que será correcto para los últimos días de diciembre, que corresponden a capricornio.
Como ves, en programación se pueden solucionar los problemas utilizando diversos enfoques. Lo importante es asegurarte de que la opción que elijas lleve a la solución correcta y tratar de ser lo más simple y eficaz posible usando las herramientas disponibles.
Espero que te haya gustado el tutorial. Hasta la próxima semana.
Un saludo.