2016-06-04 6 views
2

Wenn ich "Nein" in die Eingabe eingeben erwarte ich es 1 zu "x" hinzufügen, daher die Schleife zu beenden, aber was passiert ist, dass es ignoriert und 1 x nicht hinzufügen. Hier ist der Code.Python While-Schleife funktioniert nicht wie erwartet

x = 1 
password = "" 

while x == 1:   
    # imagine there is some code here which works 

    ans1 = input("\n\nTest a new password? ") 
    ans1 = ans1.upper() 

    print(ans1) 

    if ans1 == ("Y" or "YES"): 
     x = x 
    elif ans1 == ("N" or "NO"): 
     x = x + 10 

    print(x) 

Es ist die untere If/Elif-Anweisung, die nicht funktioniert. Es sollte weiterhin nach Eingabe fragen, bis der Benutzer NEIN sagt, aber dies funktioniert nicht.

+0

Ihr if-Zweig tut nichts, also können Sie es rauswerfen.Und Sie können eine Schleife mit "Pause" brechen. – Psytho

+0

Ich mochte diesen vorherigen Titel. "Mystery" zur Frage hinzugefügt;) –

Antwort

5

Sie sollten oder so verwenden.

if ans1 == "Y" or ans1 == "YES": 

Oder:

if ans1 in ("Y", "YES"): 

Der Fehler kommt aus der Definition des or Operator

if ans1 == ("Y" or "YES"): 

Kann ersetzt werden. Wenn Sie "Y" oder "YES" eingeben, wird "Y" zurückgegeben, da A or B definiert ist, um A zurückzugeben, wenn A nicht falsch ist. Hier ist A "Y", was kein falscher Wert ist. Also, es wird A = "Y" zurückgeben. Wenn Sie if a == ("Y" or "YES"): tun, wird il if a == "Y": entsprechen. Ok, es ist ein bisschen schwierig, aber so funktioniert Python.

Darüber hinaus ist Ihr Code sehr seltsam. Es ist eine sehr schlechte Angewohnheit, einen solchen Loop zu verlassen. Im Allgemeinen setzen wir einen booleschen Wert "looping", der auf false gesetzt wird, wenn wir die Schleife verlassen wollen.

Hier ist, wie ich Ihre Schleife tun würde:

looping = True 
password = "" 

while looping: 

    ans1 = input("\n\nTest a new password? ") 

    if ans1.upper() in ("NO", "N"): 
     looping = False 

Sie auch eine Konstruktion mit einer Endlos-Schleife verwenden (while True:). Dann rufen Sie die Anweisung break auf, um die Schleife zu beenden.

+0

Was ist der Punkt in der Looping-Variable? Warum nicht 'während True:' und 'brechen'? Ich würde nicht sagen, Ihre Lösung ist "typisch Python" – Ben

+1

Es gibt einen Fehler in Ihrer Antwort. A oder B werden A zurückgeben, wenn B falsch ist, aber wenn A nicht falsch ist. Auch wenn True: und Break sind eine gute Lösung, vor allem in Python, und es ist völlig akzeptabel. –

+0

Ich habe meinen Fehler behoben. Vielen Dank. Für die Break-Anweisung haben meine Lehrer mir immer beigebracht, dass ich es nicht zu oft benutze, also benutze ich es nie. Aber ich denke in diesem Fall ist es absolut akzeptabel. Es ist ein sehr diskutierter Punkt, wo man Break-Anweisungen verwenden und nicht verwenden darf. –

1

Nun, es ist ein Problem mit dieser Zeile: ANS1 == ("Y" oder "YES")

Es ist zu dieser Linie nicht ähnlich:

ans1 == "Y" or ans1 == "YES" 

Das zweite ist richtig, die erste heißt null coalescing. Das ist nicht was du willst. Grundsätzlich gibt das Idiom x or y x zurück, wenn x nicht null ist, andernfalls gibt es y zurück.

Also im Grunde einfach überprüfen, ob ANS1 ist „Y“ (nicht „JA“)

Sie können überprüfen, ob eine Liste von Idiomen Ihnen auf diese Weise enthält:

if ans1 in ["Y", "YES"]: 

Und Sie können Werte auch weiterhin das Hinzufügen zu dieser Liste so viele wie du willst.

2

Sie können auch "break" oder "exit" verwenden, um die Schleife oder das Programm zu verlassen. Es ist auch im Allgemeinen besser, eine größere Bedingung zu verwenden, die im unerwarteten Fall gut funktioniert (x < = 0 oder ans1 ist nicht JA anstatt x == 0 oder ans1 ist JA oder ans1 ist NEIN).

while True: 
    # Code 
    if ans1 not in ["Y", "YES"]: 
    break # or exit 

Dann würden Sie keine undefinierten Verhalten haben, und auch weniger Zustand zu kümmern: Wenn es nicht „JA“ oder „Y“, das Programm zu beenden ist.

+1

Natürlich sollte 'wahr'' 'True' sein. – Matthias

+0

Danke, bearbeitet =) –

Verwandte Themen