Calcular la dosis adecuada de suplementos para tomar -- python campo con python-3.x camp codereview Relacionados El problema

Calculate proper dosage of supplements to take


4
vote

problema

Español

Bueno, ese es mi primer "programa" después de un par de días de trabajar con Python y programación. Eso puede ser estúpido, ya que todo lo que hay tan básico, pero quería preguntar si hay espacios para mejorarlo. La idea era dar a la dosis adecuada del usuario de 4 suplementos con respecto a si este es el día de capacitación o no.

¿Hay alguna manera de lograrlo más rápido, más simple, mejor? Aprecie todos los comentarios!

Editar

¡Gracias por todas sus respuestas! Iré a través de todos ellos y aprenderé de ellos lo que puedo, todavía confundido en el mundo de la programación.

  dayon = {"BCAA" : "10g",   "White" : "50g",   "Glutamine" : "20g",   "Vitamins" : 10}  dayof= {"BCAA" : "5g",     "White" : "25g",     "Glutamine" : "10g",     "Vitamins" : 5}  username = input("What is your name? ") trening = input("Are you going to the gym today? ")  def dosage():     if trening == "yes":        return (username + ", you have to take: " +         " BCAA in dosage of: " + str(dayon["BCAA"]) +         " White in dosage of: " +str(dayon["White"]) +         " Glutamine in dosage of: " + str(dayon["Glutamine"]) +         " Vitamins in number of: " +str(dayon["Vitamins"]))     elif trening == "no":         return (username + ", you have to take: " +         " BCAA in dosage of: " + str(dayof["BCAA"]) +         " White in dosage of: " + str(dayof["White"]) +         " Glutamine in dosage of: " + str(dayof["Glutamine"]) +         " Vitamins in number of: " + str(dayof["Vitamins"]))     else:         print ("Please answer yes or no")   print (dosage())   
Original en ingles

Well, that's my first "program" after couple days of working with Python and programming itself. That may be stupid since everything there is so basic but I wanted to ask if there are any spaces to improve it. Idea was to give the user proper dosage of 4 supplements regarding if this is training day or not.

Is there any way to achieve it faster, more simple, better? Appreciate all feedback!

Edit

Thanks for all your replies! I will go through all of them and learn from them what i can, still confused in programming world.

dayon = {"BCAA" : "10g",   "White" : "50g",   "Glutamine" : "20g",   "Vitamins" : 10}  dayof= {"BCAA" : "5g",     "White" : "25g",     "Glutamine" : "10g",     "Vitamins" : 5}  username = input("What is your name?\n") trening = input("Are you going to the gym today?\n")  def dosage():     if trening == "yes":        return (username + ", you have to take: " +         "\nBCAA in dosage of: " + str(dayon["BCAA"]) +         "\nWhite in dosage of: " +str(dayon["White"]) +         "\nGlutamine in dosage of: " + str(dayon["Glutamine"]) +         "\nVitamins in number of: " +str(dayon["Vitamins"]))     elif trening == "no":         return (username + ", you have to take: " +         "\nBCAA in dosage of: " + str(dayof["BCAA"]) +         "\nWhite in dosage of: " + str(dayof["White"]) +         "\nGlutamine in dosage of: " + str(dayof["Glutamine"]) +         "\nVitamins in number of: " + str(dayof["Vitamins"]))     else:         print ("Please answer yes or no")   print (dosage()) 
     

Lista de respuestas

7
 
vote
vote
La mejor respuesta
 

Aquí está la lista de cosas que mejoraría:

  • para manejar la respuesta adecuada en el "¿Vas a ir al gimnasio hoy?", Comenzaría la mientras se realiza el bucle hasta que se ingrese" SÍ "o" NO "
  • Pon la lógica de ejecución debajo de grossIncomeafterdeduction5
  • Defina una plantilla de mensaje con los marcadores de posición apropiados: formatea con los objetos "Día en" o "día libre" y el nombre de usuario ingresado
  • Definir constantes en mayúsculas como por pep8
  • Deje que la función "Dosis" devuelva el objeto de dosificación: imprima el mensaje fuera de la función: para la mejor separación lógica
  • Añadir comentarios significativos y documentos de documentos

El código con todos los cambios sugeridos aplicados:

  grossIncomeafterdeduction6  

Demo:

  grossIncomeafterdeduction7  

Si está utilizando Python3.6 +, también puede usarla grossIncomeafterdeduction88 para formato de cadena:

  grossIncomeafterdeduction9  
 

Here is the list of things I would improve:

  • for handling the proper answer on the "Are you going to the gym today?", I would start the while loop until "Yes" or "No" is entered
  • put the execution logic under if __name__ == '__main__':
  • define a message template with appropriate placeholders - format it with "day on" or "day off" objects and the entered username
  • define constants in upper case as per PEP8
  • let the "dosage" function return the dosage object - print the message outside of the function - for the better logic separation
  • add meaningful comments and docstrings

The code with all the suggested changes applied:

DAY_ON = {     "BCAA": "10g",     "White": "50g",     "Glutamine": "20g",     "Vitamins": 10 }  DAY_OFF = {     "BCAA": "5g",     "White": "25g",     "Glutamine": "10g",     "Vitamins": 5 }  MESSAGE_TEMPLATE = """ {username}, you have to take:     BCAA in dosage of: {obj[BCAA]}     White in dosage of: {obj[White]}     Glutamine in dosage of: {obj[Glutamine]}     Vitamins in number of: {obj[Vitamins]} """   def get_dosage(is_training_day):     """Returns appropriate dosage depending on whether it is a training day or not"""     return DAY_ON if is_training_day else DAY_OFF   if __name__ == '__main__':     username = input("What is your name?\n")      while True:         choice = input("Are you going to the gym today?\n")          if choice in ('Yes', 'No'):             break         else:             print("You can only enter 'Yes' or 'No'.")      dosage = get_dosage(is_training_day=choice == 'Yes')     print(MESSAGE_TEMPLATE.format(username=username, obj=dosage)) 

Demo:

$ python3 test.py  What is your name? Chubaka Are you going to the gym today? What? You can only enter 'Yes' or 'No'. Are you going to the gym today? No  Chubaka, you have to take:     BCAA in dosage of: 5g     White in dosage of: 25g     Glutamine in dosage of: 10g     Vitamins in number of: 5 

If you are using Python3.6+, you can also use f-strings for string formatting:

dosage = get_dosage(is_training_day=choice == 'Yes') print(f""" {username}, you have to take:     BCAA in dosage of: {dosage['BCAA']}     White in dosage of: {dosage['White']}     Glutamine in dosage of: {dosage['Glutamine']}     Vitamins in number of: {dosage['Vitamins']} """) 
 
 
 
 
5
 
vote

1.- Siga la convención al usar nombres (es decir, debe usar_underscore). Si son constantes, entonces use_uppercase. (De Dayon a Day_on)

2.- Si tiene variables numéricas que se están utilizando como cadenas (quiero decir, no está esperando calcular algo con ellos), luego los declara como cuerdas. (De "Vitaminas": 10 a 'Vitaminas': '10')

3.- Si tiene un diccionario (Day_on / Day_off) intente colocar elementos del mismo tipo. No es una buena idea mezclar cuerdas con enteros (o con otro tipo) (otra razón para: de "Vitaminas": 10 a 'Vitaminas': '10')

4.- Una buena práctica es declarar crear métodos que solo haga una cosa. Por ejemplo, un método (imprimir), simplemente imprima las dosis (no se preocupa por la entrada de usuario o el tipo de la dosis), otra (cálculo_dosage) simplemente calcule la dosis según un parámetro (no se preocupa por la entrada del usuario)

5.- Luego, tratando de agregar robustez, ¿qué pasa si el usuario no escribe ningún nombre? ¿Qué pasa si el usuario escribe 'sí' o 'sí' en lugar de 'sí'? Las últimas líneas intentan evitar esos problemas. También puedes crear un método para esto.

6.- Editar, agregando retroalimentación de Graipher; Cadena de fijación que se compara usando '==' en lugar de 'is'


  grossIncomeAfterDeduction0  
 

1.- Follow convention when using names (ie, you should use_underscore). If are constant then USE_UPPERCASE. (From dayon to DAY_ON)

2.- If you have numeric variables that are being used as a strings (I mean, you are not expecting to calculate something with them) then declare them as strings. (From "Vitamins": 10 to 'Vitamins': '10')

3.- If you have an dictionary (DAY_ON/DAY_OFF) try to put elements of the same type. Is not a good idea mix strings with integers (or with another type) (Another reason for: From "Vitamins": 10 to 'Vitamins': '10')

4.- A good practice is declaring create methods that only does one thing. For example one method (print_doses) just print the doses (doesn't care about user input or type of the dose), another (calculate_dosage) just calculate the dose according an parameter (does't care about the user input)

5.- Then, trying to add robustness, what if the user doesn't write any name? What if the user write 'YES' or 'Yes' instead of 'yes'? The last lines try to avoid those problems. Also you can create a method for this.

6.- Edit, adding Graipher feedback; Fixing string comparing using '==' instead of 'is'


DAY_ON = {'BCAA': '10g',           'White': '50g',           'Glutamine': '20g',           'Vitamins': '10'}  DAY_OFF = {'BCAA': '5g',            'White': '25g',            'Glutamine': '10g',            'Vitamins': '5'}  POSITIVE_ANSWERS = ['yes', 'y', 'true', '1'] NEGATIVE_ANSWERS = ['no', 'n', 'false', '0'] VALID_ANSWERS = POSITIVE_ANSWERS + NEGATIVE_ANSWERS  INVALID_ANSWER = "Insert a valid name and a valid answer [yes] or [no]"   def print_doses(name, daily_doses):     print('{0}, you have to take:'.format(name))      for key in daily_doses.keys():         print('{0} in dosage of: {1}'.format(key, daily_doses[key]))   def calculate_dosage(name, is_training):     doses = DAY_ON if is_training else DAY_OFF     print_doses(name, doses)   username = input('What is your name?\n') training = input('Are you going to the gym today?\n')  if username is None or training not in VALID_ANSWERS:     print(INVALID_ANSWER_MSGE) else:     is_training = str.lower(training) in POSITIVE_ANSWERS     calculate_dosage(username, is_training) 
 
 

Relacionados problema

5  Suma de todos los dígitos en una cadena  ( Sum of all digits in a string ) 
Dada una cadena, devuelva la suma de todos los números en la cadena, 0 si no hay ninguno. A continuación es mi solución para el problema anterior. Siento ...

2  Implementación de árboles de búsqueda de ternarios en Python 3  ( Ternary search tree implementation in python 3 ) 
He implementado un árbol de búsqueda ternario. Funciona bien. Pero si crees que algo necesita mejorarse, dígalo. Este código fue probado en Python 3.7.4. c...

2  Algoritmo de libros que se ocupa de sumas de dígitos cuadrados  ( Books algorithm dealing with square digit sums ) 
un pequeño contexto: libro tiene 411 páginas Lea un número aleatorio de páginas en el primer día que es desconocido Número de páginas para leer e...

3  Juego de Hangman escrito en Python 3.5  ( Hangman game written in python 3 5 ) 
Esto recopila las conjeturas del usuario para la palabra. El usuario tiene 8 conjeturas, una conjetura correcta y una suposición repetida no afecta al conteo ...

7  Juego de Blackjack hecho en Python 3  ( Blackjack game made in python 3 ) 
Este es un juego de blackjack simple, terminé de hacer con Python. Espero que te guste y estoy abierto a cualquier sugerencia o crítica que me darías. NSUS...

5  Orden de número más grande en cadena  ( Largest number order in string ) 
Dada una cadena, suponiendo que la cadena sea solo números, reorganice la cadena a la que sea el mayor número posible. a continuación es mi solución al pr...

5  Excel a JSON Parser con http descargar  ( Excel to json parser with http download ) 
He estado trabajando en un proyecto ( enlace ) a Descargue una hoja de cálculo de Ransomware y propiedades conocidas y conviértase en JSON para que pueda cons...

4  Calculadora binaria de Python  ( Python binary calculator ) 
Mi tarea fue construir una calculadora en la adición binaria de soporte de Python, etc. Para comenzar Definir un par de excepciones personalizadas: paper...

0  Producto cartesiano de dos tuplas - Python  ( Cartesian product of two tuples python ) 
Estoy resolviendo el ejercicio 4 de Discusión 3 de CS 61A (2012) de Berkley (2012) (consulte la página 4): Rellene la definición de cartesian_product . ...

5  Acelera a OpenGL 2D en Python3  ( Accelerate opengl 2d on python3 ) 
Estoy usando OpenGL para dibujar alrededor de 20 círculos. Cada círculo tiene 2 líneas, ~ 10 segmentos, y todos ellos tienen diferentes colores y longitudes. ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos