2016-05-18 23 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):") 

zu akzeptieren und ich den unten Fehlermeldung erhalten, auch habe ich versucht, str() um die Variable zu verwenden haben auch den gleichen Fehler, mich auch beraten, wie kann ich eine ausführen Technik, ein Spiel oder eine Runde in einem Spiel zu beenden, indem man etwas ähnlich dem oben genannten verwendet, wenn es nicht der beste Weg ist.Ich möchte die Möglichkeit haben, zu beenden oder bestimmte Wertebereich

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

Antwort

1

einfach fix: Klammern hinzu:

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):") 

Ohne Klammern es immer or int (q) > 51 versuchen wird, wenn die erste Bedingung falsch ist. (also wenn q == 'q') Aber mit den Klammern wird es nicht weiter bewerten, wenn q == 'q', so dass Sie sich keine Sorgen über die Erhöhung eines Fehlers machen müssen. Auf der anderen Seite sind Sie noch nicht von anderen ungültigen Eingaben geschützt:

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' 

so könnten Sie auch erneut die Kontrolle vor der int Umwandlung hinzufügen, um sicherzustellen, dass alle Zeichen Ziffern sind (.isdigit()) sowie:

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

dank, q = Eingang ("eingeben (1- 51) oder (q zum Beenden): ") \t während q! = 'Q' und (q.isdigit() und (int (q) <1 oder int (q)> 51)): \t \t q = Eingabe ("enter (1-51) oder (q zu beenden): ") – Samir

+0

, die immer noch nicht die richtige Logik, wenn' q.isdigit() 'ist False (wie in keine gültige Zahl) die While-Schleife bricht! –

+0

Sie müssten 'not (q.isdigit() und' zu '(nicht q.isdigit() oder' –

0

Ihr Programm ist fast korrekt. Hier ist das Update:

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

Normalerweise and hat eine höhere Priorität als or. Ihr ursprünglicher Code wäre also wie folgt interpretiert worden:

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

Diese Interpretation führt jedoch zu fehlerhaftem Verhalten. Denn wenn q == 'q', dann die != falsch ist, ist die and Klausel falsch, so dass die dritte Klausel nach der or ausgewertet wird. Dies führt dazu, dass int(q) ausgewertet wird, was die Ausnahme verursacht.

+0

dank Nayuki, es korrigierte mein Problem, auch heute habe ich gelernt, dass und wird vor dem oder (y ) ausgewertet – Samir

+0

macht Sinn, da und ist die Multiplikation während OR ist zusätzlich – Samir