2014-09-22 2 views
0

Мне просто интересно, почему цикл не прерывается, когда он удовлетворяет этим условиям и фильтрует его в мои другие функции? Я исправил это, выполняя цикл while и просто разбивая каждый оператор if, но я хотел бы знать, что не так с этим.Python while loop не прерывается при выполнении условий

Защиту main_entrance():

print "\n\tYou are in the main entrance. It is a large room with" 
print "\ttwo doors, one to the left and one to the right. There" 
print "\tis also a large windy stair case leading up to a second floor." 
print "\n\tWhat are you going to do?\n" 
print "\t #1 take the door on the left?" 
print "\t #2 take the door on the right?" 
print "\t #3 take the stairs to the second floor?" 

choice = 0 

#This seems to be the part that isn't working as I would expect it to. 
# I have fixed it and have commented the fix out so that I can understand 
# why this way isn't working. 

#while True: 

while (choice != 1) or (choice != 2) or (choice != 3): 


    try: 
     choice = int (raw_input ('> ')) 
     if (choice == 1): 
      door_one_dinning_room() 
      #break (should not need this break if choice is == 1, 2, 3) 

     elif (choice == 2): 
      door_two_study() 
      #break 

     elif (choice == 3): 
      stairs_to_landing() 
      #there isn't anything in this function 
      #but rather than breaking out from the program once it is 
      # called, but somehow this while loop is still running. 

      #break 

     else: 
      print "You must pick one!" 

    except: 
     print "Please pick a number from 1-3" 
     continue 
+1

[Это] (http://stackoverflow.com/a/25860636/1189040) может быть лучшей альтернативой – Himal

ответ

9

Конечно, это не ломается, ваше состояние не может быть ложным

(choice != 1) or (choice != 2) or (choice != 3) 

Подумайте об этом на минуту, любой выбор выбора не может сделать это выражение ложно.

выбор = 1

False or True or True --> True 

выбор = 2

True or False or True --> True 

выбор = 3

True or True or False --> True 

Решение

Вы пе Эда and условия вместе

(choice != 1) and (choice != 2) and (choice != 3) 

Или еще лучше

while choice not in [1,2,3] 
+0

хорошо объясненное и сжатое решение! Мне очень нравится этот ответ! –

+0

Черт, почему я этого не заметил! gah, теперь чувствую себя глупо. ЛОЛ .. Да, моя логика прошла. Новое для программирования .. Спасибо, что все это имеет смысл! –

+0

Используйте {1,2,3} вместо [1,2,3]. Установки поиска более эффективны, чем поиск списков. В зависимости от того, какую версию Python вы используете, литеральный набор (или список) может быть создан во время компиляции, а не времени выполнения, что будет подчеркивать ускорение. – chepner

5
while (choice != 1) or (choice != 2) or (choice != 3): 

Это условие всегда истинно. Если ваша переменная choice равна 1, то choice!=1 является ложным, но choice!=2 истинно, поэтому все условие истинно. Это то, что означает or.

Вы могли бы поставить:

while (choice != 1) and (choice != 2) and (choice != 3): 

или более лаконично:

while choice not in (1,2,3): 
+0

как и выше .. спасибо очень много ... –

+0

Используйте '{1,2,3}' вместо '(1,2,3)'. Установки поиска более эффективны, чем поисковые запросы. В зависимости от того, какую версию Python вы используете, буквенный набор (или кортеж) может быть создан во время компиляции, а не времени выполнения, что будет подчеркивать ускорение. – chepner