J'ai le code suivant que j'essaie de valider que l'entrée fournie par l'utilisateur est supérieure à zéro, mais la valeur renvoyée n'est pas la valeur correcte - par exemple, si j'entre un zéro pour le premier angle, puis tapez quelque chose de supérieur à zéro, le zéro est renvoyé et non la valeur correcte. Des idées sur la façon de résoudre le problème?
def ValidTriangle(firstAngle, secondAngle, thirdAngle): if (firstAngle + secondAngle + thirdAngle) == 180: print("The triangle is indeed a valid triangle") else: print("The triangle is not valid") def ValidateInput(angle): if angle <=0: isValid = False else: isValid = True while isValid == False: try: angle = int(input('Please try again')) break except ValueError: return(angle) angle1 = int(input("Please enter the first angle of the triangle: \n")) ValidateInput(angle1) angle2 = int(input("Please enter the second angle of the triangle: \n")) ValidateInput(angle2) angle3 = int(input("Please enter the third angle of the triangle: \n")) ValidateInput(angle3) ValidTriangle(angle1,angle2,angle3)
3 Réponses :
Vous avez oublié de mettre une clause d'angle de retour sous la condition IsValid est True et après avoir rompu la clause while. Vous devriez ajouter cela et cela devrait fonctionner. C'est-à-dire
def ValidateInput(angle): if angle <=0: isValid = False else: isValid = True return(angle) _angle = angle while isValid == False: try: _angle = int(input('Please try again')) break except ValueError: return(_angle)
Vous l'avez renvoyé en cas d'erreur, mais vous avez également la variable appelée dans la fonction imitant celle qui est créée dans la fonction, c'est aussi déroutant. Il devrait renvoyer un nom de variable différent pour éviter cette imitation aussi, je crois.
Je n'ai peut-être pas bien expliqué cela, mais j'espère que cela aide.
Je vois toujours le même résultat lorsque je l'essaye de cette façon - c'est-à-dire que seule la valeur invalide est renvoyée
vous devez stocker la valeur retournée de ValidateInput dans angle1 angle1 = ValidateInput (angle1)
et ainsi de suite avec chacun des appels ValidateInput. De cette façon, si ValidateInput a une nouvelle valeur pour l'angle, vous la stockez et l'utilisez lorsque vous validez le triangle.
Assurez-vous que ValidateInput renvoie l'angle modifié. De plus, la boucle while ici peut être remplacée par la récursivité pour appeler à nouveau ValidateInput:
def ValidTriangle(firstAngle, secondAngle, thirdAngle): if (firstAngle + secondAngle + thirdAngle) == 180: print("The triangle is indeed a valid triangle") else: print("The triangle is not valid") def ValidateInput(prompt): angle = int(input(prompt)) if angle <= 0: isValid = False else: isValid = True if not isValid: angle = ValidateInput('Please try again: ') return angle angle1 = ValidateInput("Please enter the first angle of the triangle: \n") angle2 = ValidateInput("Please enter the second angle of the triangle: \n") angle3 = ValidateInput("Please enter the third angle of the triangle: \n") ValidTriangle(angle1,angle2,angle3)
Ici aussi, la boucle while peut être remplacée par la récursivité pour appeler à nouveau ValidateInput Pourquoi ...? De tous les changements qui pourraient être apportés ...
De plus, cette solution ne réplique pas la fonctionnalité du programme d'OP, car il n'y a pas de vérification si l'entrée est réellement un int valide,
Bien que je ne sois pas tout à fait certain de la meilleure approche pour accepter et valider les entrées dans cette situation, cette solution devrait être assez idiomatique et sensée.
def is_valid_triangle(angle_1: float, angle_2: float, angle_3: float) -> bool: return angle_1 + angle_2 + angle_3 == 180 def get_gt_zero_input(prompt_msg: str) -> int: while True: raw_in = input(prompt_msg) try: int_val = int(raw_in) except ValueError: input(f'ERROR: Invalid input: {raw_in}.\nPress ENTER to continue.') else: if int_val > 0: return int_val else: input(f'ERROR: Input {int_val} is smaller than or equal to 0.\nPress ENTER to continue.')
ValidateInput
ne renvoie quelque chose qu'en cas d'erreur; pas que ce soit important, puisque vous ne faites rien avec une valeur renvoyée.Les noms de variable et de fonction doivent suivre le style
lower_case_with_underscores
.