2016-05-18 2 views
-1
q = input ("enter(1-51) or (q to quit):") 
while q != 'q' and int (q) < 1 or int (q) > 51: 
    q = input ("enter(1-51) or (q to quit):") 

et je reçois l'erreur ci-dessous, aussi j'ai essayé d'utiliser str() autour de la variable a également obtenu la même erreur, me conseiller aussi comment puis-je effectuer une technique de sortie d'un jeu ou d'un tour dans un jeu en utilisant quelque chose de similaire à ce qui précède si ce n'est pas la meilleure façon.Je veux avoir la possibilité de quitter ou d'accepter plage de valeurs spécifiques

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: 'q' 

Répondre

1

fix très simple: ajouter entre parenthèses:

q = input ("enter(1-51) or (q to quit):") 
while q != 'q' and (int (q) < 1 or int (q) > 51): 
    # brackets here^    and here ^
    q = input ("enter(1-51) or (q to quit):") 

Sans parenthèses, il essayera toujours or int (q) > 51 si le premier conditionnel est faux. (donc quand q == 'q') Cependant, avec les parenthèses, il ne sera plus évalué lorsque q == 'q' donc vous n'avez pas à vous soucier de déclencher une erreur. D'autre part, vous n'êtes toujours pas protégé d'une autre entrée invalide:

enter(1-51) or (q to quit):hello 
Traceback (most recent call last): 
    File "/Users/Tadhg/Documents/codes/test.py", line 2, in <module> 
    while q != 'q' and (int (q) < 1 or int (q) > 51): 
ValueError: invalid literal for int() with base 10: 'hello' 

vous pourriez alors ajouter un autre contrôle avant la conversion int pour vous assurer que tous les caractères sont des chiffres (.isdigit()) ainsi:

while q !='q' and not (q.isdigit() and 1<=int(q)<=51): 
+0

grâce, q = entrée ("entrer (1- 51) ou (q pour quitter): ") \t tant que q! = 'Q' et (q.isdigit() et (int (q) <1 ou int (q)> 51)): \t \t q = entrée ("Entrée (1-51) ou (q pour quitter): ") – Samir

+0

qui n'a toujours pas la bonne logique, quand' q.isdigit() 'est False (comme dans un nombre non valide) la boucle while se brise! –

+0

vous auriez besoin de changer 'non (q.isdigit() et' être' (pas q.isdigit() ou' –

0

Votre programme est presque correct. Voici la solution:

while q != 'q' and (int (q) < 1 or int (q) > 51): 

Normalement, and a une priorité supérieure or. Donc, votre code original aurait été interprété comme:

while (q != 'q' and int (q) < 1) or int (q) > 51: 

Mais cette interprétation conduit à un comportement défectueux. Parce que si q == 'q', le != est faux, la clause and est false, donc la troisième clause après le or est évaluée. Cela provoque l'évaluation int(q), ce qui provoque l'exception.

+0

grâce Nayuki, il corrigé mon problème, aujourd'hui encore, j'appris que et s'évalué avant le ou (y ) – Samir

+0

est logique, comme la multiplication et est en OR est l'addition – Samir