Je crée une application qui calcule vos dépenses énergétiques quotidiennes. Pour cela, j'ai 2 fonctions qui utiliseront les informations fournies dans les entrées.

Maintenant, le problème est lorsqu'un utilisateur ne fournit pas de réponse sur un entier, l'entrée doit poser à nouveau la question jusqu'à ce qu'elle soit valide. Pour cela, j'ai une boucle pour chaque entrée que j'ai faite, mais je voudrais l'avoir dans 1 boucle afin que je puisse poser la question à la fin de la boucle s'ils veulent continuer ou terminer la calculatrice.

Ci-dessous mon code (il est en néerlandais)

while True:
    try:
        leeftijd = int(input("Wat is uw leeftijd in jaren ? "))
        break
    except ValueError:
        print("Vul het opnieuw in !")
while True:
    try:
        gewicht = int(input("Wat is uw gewicht in kilogrammen ? "))
        break
    except ValueError:
        print("Vul het opnieuw in !")
while True:
    try:
        lengte = int(input("Wat is uw lengte in centimeters ? "))
        break
    except ValueError:
        print("Vul het opnieuw in !")
geslacht = input("Wat is uw geslacht (m/v) ? ")
while True:
    try:
        beweging = int(input("Hoeveel wandelt u per dag (minuten) ? "))
        break
    except ValueError:
        print("Vul het opnieuw in !")

J'espère que c'est assez clair pour comprendre. Merci d'avance!

1
hood90 17 avril 2020 à 12:51

3 réponses

Meilleure réponse

Mettez la logique pour demander l'entier dans une fonction et appelez cela avec différents textes. Utilisez une boucle et un break conditionnel pour quitter votre boucle sans fin:

def ask_int(text, error_text):
    while True:
        try:
            return int(input(text))
        except ValueError:
            print(error_text)

leeftijd = ask_int("Wat is uw leeftijd in jaren ? ", "Vul het opnieuw in !")
gewicht = ask_int("Wat is uw gewicht in kilogrammen ? ", "Vul het opnieuw in !")
lengte = ask_int("Wat is uw lengte in centimeters ? ", "Vul het opnieuw in !")
geslacht = input("Wat is uw geslacht (m/v) ? ")

while True:
    beweging = ask_int("Hoeveel wandelt u per dag (minuten) ? ", "Vul het opnieuw in !")
    # do something with the things - calculate & print
    print(leeftijd, gewicht, lengte, geslacht, beweging)

    if input("Calculate another time? (*/n)") == "n":
        break  # leaves the loop

Production:

# All inputes:   A,1,1,1,m,a,42,y,100,n

Wat is uw leeftijd in jaren ? A
Vul het opnieuw in !
Wat is uw leeftijd in jaren ? 1
Wat is uw gewicht in kilogrammen ? 1
Wat is uw lengte in centimeters ? 1
Wat is uw geslacht (m/v) ? m
Hoeveel wandelt u per dag (minuten) ? a
Vul het opnieuw in !
Hoeveel wandelt u per dag (minuten) ? 42
1 1 1 m 42
Calculate another time? (*/n) y
Hoeveel wandelt u per dag (minuten) ? 100
1 1 1 m 100
Calculate another time? (*/n) n

Si vous souhaitez également permettre de changer la personne, mettez-le également dans une fonction:

def ask_person():
    lee = ask_int("Wat is uw leeftijd in jaren ? ", "Vul het opnieuw in !")
    gew = ask_int("Wat is uw gewicht in kilogrammen ? ", "Vul het opnieuw in !")
    leng = ask_int("Wat is uw lengte in centimeters ? ", "Vul het opnieuw in !")
    ges = input("Wat is uw geslacht (m/v) ? ")

    return lee, gew, leng, ges  # return a tuple of your data


# get initial person data, decompose tuple into variables    
leeftijd, gewicht, lengte, geslacht = ask_person()

while True:
    beweging = ask_int("Hoeveel wandelt u per dag (minuten) ? ", "Vul het opnieuw in !")

    print(leeftijd,gewicht,lengte,geslacht,beweging)

    choice = input("Calculate another time? (y/n) or C to change person") 
    if choice == "n":
        break  
    elif choice == "C":
        # change to other person data
        leeftijd, gewicht, lengte, geslacht = ask_person()

Lire Demander à l’utilisateur de saisir des informations jusqu’à ce qu’il donne un réponse valide pour plus d'inspiration sur le sujet.

1
Patrick Artner 17 avril 2020 à 10:13

En fait, vous devriez également vérifier le type de réponse float!

Vous pouvez utiliser une boucle comme celle-ci, avec une liste de questions. Ici, je stocke les résultats dans un dictionnaire où la clé est la question, mais ils peuvent également être stockés sous forme de liste ou d'autres objets.

questions = [
    ["Wat is uw leeftijd in jaren ? ", int],
    ["Wat is uw gewicht in kilogrammen ? ", int],
    ["Wat is uw lengte in centimeters ? ", int],
    ["Wat is uw geslacht (m/v) ? ", float]
    ["Hoeveel wandelt u per dag (minuten) ? ", int]
]

def ask(question, variabletype):
    while True:
      try:
          answers[question] = variabletype(input(question))
          break
      except ValueError:
          print("Variable should be of type", variabletype.__name__)

answers = {}
for question, variabletype in questions:
    answers[question] = ask(question, variabletype)

Ou sans boucle sur la question:

def ask(question, variabletype):
    while True:
      try:
          answers[question] = variabletype(input(question))
          break
      except ValueError:
          print("Variable should be of type", variabletype.__name__)

answers = {}
for question, variabletype in questions:
    answers[question] = ask(question, variabletype)

a0 = ask("Wat is uw leeftijd in jaren ? ", int)
a1 = ask("Wat is uw gewicht in kilogrammen ? ", int)
a2 = ask("Wat is uw lengte in centimeters ? ", int)
a3 = ask("Wat is uw geslacht (m/v) ? ", float)
a4 = ask("Hoeveel wandelt u per dag (minuten) ? ", int)
1
Keldorn 17 avril 2020 à 10:16

Une solution consiste à boucler la boucle à l'intérieur d'une fonction et à l'appeler pour chaque question:

def question(q):
    while True:
        try:
            var = int(input(q))
            return var
        except ValueError:
            print("Vul het opnieuw in !")

leeftijd = question("Wat is uw leeftijd in jaren ? ")
gewicht = question("Wat is uw gewicht in kilogrammen ? ")
lengte = question("Wat is uw lengte in centimeters ? ")
beweging = question("Hoeveel wandelt u per dag (minuten) ? ")
geslacht = input("Wat is uw geslacht (m/v) ? ")
0
Hampus Larsson 17 avril 2020 à 10:03