2012-09-23 11 views
9
Python

Dies ist das Stück Code, die ich habe:Wie testen Sie diese Variable ist nicht gleich mehrere Dinge?

choice = "" 

while choice != "1" and choice != "2" and choice != "3": 
    choice = raw_input("pick 1, 2 or 3") 

    if choice == "1": 
     print "1 it is!" 

    elif choice == "2": 
     print "2 it is!" 

    elif choice == "3": 
     print "3 it is!" 

    else: 
     print "You should choose 1, 2 or 3" 

Während es funktioniert, ich glaube, dass es wirklich ungeschickt ist, insbesondere die während Klausel. Was ist, wenn ich akzeptablere Entscheidungen habe? Gibt es einen besseren Weg, die Klausel zu machen?

+0

Sind Sie immer gehen zu Druck 'Wahl,„es ist“' (?) oder werden das wirklich getrennte Fälle sein? –

+0

@hayden Der eigentliche Code ist sehr unterschiedlich, ich habe es einfach vereinfacht, um die Frage klarer zu machen. – M830078h

+1

Ich merke, es wurde vereinfacht (gute Arbeit), aber ich fragte mehr: (wenn 1 f(), wenn 2 tun g(), ... und nicht, wenn 1 oder 2, tun Sie f(). Seit Sie akzeptiert haben die Antwort, diese können nicht wirklich getrennte Fälle sein :). –

Antwort

25

Der während Bit ein wenig Refactoring werden könnte, um es ein wenig sauberer zu machen, indem geprüft wird, ob das Element innerhalb einer Liste von Auswahlmöglichkeiten wie so

ist
while choice not in [1, 2, 3]: 

Diese Überprüfung wird der Wert der Wahl ist nicht ein Element in dieser Liste

+4

Wie eine Anmerkung, ist es wahrscheinlich sinnvoller, hier ein gesetztes Literal über ein Listenliteral ('' {1, 2, 3} '') zu verwenden, da die Reihenfolge keine Rolle spielt und die Mitgliedschaftsüberprüfung schneller ist - nicht wirklich wichtig, aber als eine Frage des Stils, könnte auch die Klammern tauschen. –

4

Sie können die Logik in die Schlaufe schieben und

while choice != "1" and choice != "2" and choice != "3": 

mit

while True: 

ersetzen und dann die ursprüngliche Linie choice = "" ist nicht erforderlich. Wenn Sie fertig sind, können Sie in jedem Zweig break.

+0

@hayden:? Ich behaupte nicht, dass er den Code aus der Schleife entfernt. – DSM

+0

Ich habe versucht, 'while True' zu ​​vermeiden, hauptsächlich weil ich keine Endlosschleife haben wollte und aus irgendeinem Grund nicht an' break' dachte. Ich werde Ihren Ratschlag tatsächlich in meinem Code verwenden, obwohl Suhail Patels Antwort besser zu der Frage passt. Vielen Dank! – M830078h

+1

@ M830078h: mein Problem bei der Verwendung von Mitgliedschaft Tests wie folgt ist, dass, wenn Sie entscheiden, dass Sie einen neuen Fall hinzufügen (sagen "4"), jetzt müssen Sie es an zwei Stellen hinzufügen. Das ist eine DRY-Verletzung (wiederhole dich nicht), und wenn ich das begehe, stelle ich normalerweise Bugs auf .. – DSM

0

while str(choice) not in "123" .....

0

ich glaube, Sie einen Satz verwenden können, die alle Ihre Wahlmöglichkeiten und die Verwendung „in“ Ausdruck enthält den während eines Teil judgefor.

Wie beim if-else-Teil ist print (Auswahl, "es ist!") In Ordnung.

1

Sie können ein Wörterbuch verwenden, um 1 dem Code zuzuordnen, den Sie ausführen möchten, wenn 1 der Wert ist, und so weiter ... Auf diese Weise werden Sie die IFS los und Ihr Code kann in Zukunft andere Werte unterstützen einfach das Wörterbuch aktualisieren. Wie für die Bedingung in der Weile, überprüfen Sie nur, ob der Schlüssel im Wörterbuch ist.

3

Ich denke, so etwas wie das

possilities = {"1":"1 it is!", "2":"2 it is!", "3":"3 it is!"} 
choice = "" 

while True: 
    choice = raw_input("pick 1, 2 or 3") 
    if choice in possilities: 
     print possilities[choice] 
     break 
    else: 
     print "You should use 1, 2 or 3" 
1

besser wäre, würde ich vorschlagen a function, die gerade durchlaufen, bis eine gültige Option gewählt wird, dann den gewählten Wert zurückgibt.

Dies bedeutet, dass der Rest des Codes ist nicht in den while bestimmt, alles schön flach zu halten ("Flat is better than nested")

def get_choice(options): 
    """Given a list of options, makes the user select one. 

    The options must be strings, or they will never match (because raw_input returns a string) 

    >>> yn_choices = ['y', 'n'] 
    >>> a = get_choice(options = yn_choices) 
    """ 
    prompt_string = "Pick " + ", ".join(options) 
    while True: 
     choice = raw_input(prompt_string) 
     if choice in options: 
      return choice 
     else: 
      print "Invalid choice" 

# Prompt user for selection 
choice = get_choice(["1", "2", "3"]) 

# Do stuff with choice... 
if choice == "1": 
    print "1 it is!" 

elif choice == "2": 
    print "2 it is!" 

elif choice == "3": 
    print "3 it is!" 

else: 
    print "You should choose 1, 2 or 3" 
Verwandte Themen