2012-09-23 15 views
9

To jest kawałek kodu mam:Jak przetestować tę zmienną nie jest równa wielu rzeczy? Python

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" 

Chociaż to działa, czuję, że to naprawdę niezgrabny, szczególnie gdy klauzula. Co się stanie, jeśli będę miał więcej akceptowalnych wyborów? Czy istnieje lepszy sposób na wprowadzenie klauzuli?

+0

Czy zawsze będzie drukowanie 'wybór„ to”' (?) czy też będą to naprawdę oddzielne przypadki? –

+0

@hayden Rzeczywisty kod jest bardzo różny, po prostu uprośniłem go, aby pytanie stało się bardziej jasne. – M830078h

+1

Rozumiem, że był uproszczony (dobra robota), ale ja raczej pytałem: (jeśli 1 do f(), jeśli 2 do g(), ... zamiast 1 lub 2, do f(). odpowiedź, te nie mogą być prawdziwie oddzielnymi przypadkami :). –

Odpowiedz

25

while bit może być refactored trochę zrobić to trochę czystsze przez sprawdzenie, czy element jest w liście wyboru Podobnie jak

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

to sprawdzanie jest wartością wyboru nie jest elementem tej listy

+4

Tak jak w notatce, prawdopodobnie bardziej sensowne jest użycie literału set literalnego tutaj ('' {1, 2, 3} ''), ponieważ kolejność nie ma znaczenia i czeki członkowskie są szybsze na planie - prawdopodobnie nie ma znaczenia, ale ze względu na styl może równie dobrze zamienić zamki. –

4

Można naciskać logikę do pętli i zastąpić

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

z

while True: 

a następnie początkowa linia choice = "" jest niepotrzebna. Następnie, w każdym oddziale, gdy skończysz, co chcesz zrobić, możesz break.

+0

@hayden:? Nie sugeruję, że usuwa kod z pętli. – DSM

+0

Starałem się unikać 'while while True', głównie dlatego, że nie chciałem mieć niekończącej się pętli iz jakiegoś powodu nie myślałem o' break'. Będę używał twojej rady w moim kodzie, chociaż odpowiedź Suhaila Patela lepiej pasuje do pytania. Dzięki! – M830078h

+1

@ M830078h: Mój problem z używaniem testów członkostwa polega na tym, że jeśli zdecydujesz, że chcesz dodać nową sprawę (powiedz "4"), teraz musisz dodać ją w dwóch miejscach. To jest SUCHA (nie powtarzaj się) naruszenie, a kiedy je popełniam, zwykle wprowadzam błędy. – DSM

0

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

0

myślę, że można użyć zestawu, który zawiera wszystkich możliwych wyborów i ich wykorzystywania „w” wypowiedzi judgefor część chwilę.

Jeśli chodzi o część if-else, print (wybór, "to jest!") Będzie w porządku.

1

Możesz użyć słownika do odwzorowania 1 na kod, który chcesz wykonać, gdy 1 jest wartością, i tak dalej ... W ten sposób pozbędziesz się ifs, a twój kod będzie obsługiwał inne wartości w przyszłości przez po prostu aktualizuję słownik. Jeśli chodzi o warunek w czasie, wystarczy sprawdzić, czy klucz znajduje się w słowniku.

3

Myślę, że coś takiego byłoby lepiej

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

Sugeruję mający a function który właśnie pętle aż prawidłowy opcja zostanie wybrana, a następnie zwraca wybraną wartość.

Oznacza to reszta kodu nie jest przeznaczony wewnątrz while, utrzymując wszystko ładne i płaskie ("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" 
Powiązane problemy