2012-03-21 4 views
-1

В Python 3.2 я пишу основную программу меню, и когда вводится опция quit, функция не заканчивается. Когда выбрано quit, он завершает цикл, в котором находится остальная часть скрипта, и должен прекратить выполнение скрипта, но по какой-либо причине это не так? Я пропустил функцию «конец», которая убивает скрипт, или новая оболочка Python просто глючит? Довольно уверен, что это не было необходимо в Python 2.7.Завершение скрипта Python

import random 
choice = str(input("\nMenu:\n(I)nstructions\n(C)alculate blah\n(Q)uit\n>>>")) 
while choice != "q" or choice != "Q": 
    while choice != "i" and choice != "I" and choice != "c" and choice != "C" and choice != "q" and choice != "Q": 
     print("Invalid menu choice.") 
     choice = str(input("\nMenu:\n(I)nstructions\n(C)alculate blah\n(Q)uit\n>>>")) 
    if choice == "i" or choice == "I": 
     print("blahblah.") 
     choice = str(input("\nMenu:\n(I)nstructions\n(C)alculate blah\n(Q)uit\n>>>")) 
    if choice == "c" or choice == "C": 
     x = int(input("Please enter the number of x: ")) 
     while x < 0: 
      x = int(input("Please enter the number of x: ")) 
     y = int(input("Please enter the number of y: ")) 
     while y < 0: 
      y = int(input("Please enter the number of y: ")) 
     z = str(input("blah (B) or (P) z?: ")) 
     while z != "b" and z != "p" and z != "B" and z != "P": 
      z = str(input("blah (B) or (P) z?: ")) 
     if z == "b" or z == "B": 
      total = x*10 + y*6 + 0 
      print("blah $", total, " blah ", x, " x and ", y, " y. blah!") 
     #function that outputs the cost of premium z 
     if z == "p" or z == "P": 
      luck = random.randrange(1, 11, 1) 
      if luck == 10: 
       total = x*10 + y*6 
       print("\nblah$", total, " blah z for ", x, " x and ", y, " y. blah!") 
      #below is the normal function, for when the customer is not a lucky winner 
      if luck != 10: 
       total = x*12.50 + y*7.50 
       print("blah $", total, " blah ", x, " x and ", y, " y. blah!") 
     choice = str(input("\nMenu:\n(I)nstructions\n(C)alculate\n(Q)uit\n>>>")) 
+3

Ничто не может сказать, не видя код. – bereal

+0

Если вы хотите, чтобы скрипт вышел, вы можете использовать 'sys.exit (0)', но да, покажите код, если вы хотите получить более конкретную помощь. –

+0

pastebin.com/Ww4auw7E Я не мог думать о загружаемом веб-сайте, которому я мог бы доверять, но вот пародия кода. Это ничего сложного, просто пытается понять, что здесь происходит. – Epidemic

ответ

5

Ваше состояние является неправильным:

while choice != "q" or choice != "Q": # this should be "and"! 

всегда возвращает True, создавая бесконечный цикл.

Кроме того, у вас здесь довольно сложная логика. Это может быть упрощен много:

import random 
while True: 
    choice = str(input("\nMenu:\n(I)nstructions\n(C)alculate blah\n(Q)uit\n>>>")).lower() 
    if choice == "i": 
     print("blahblah.") 
     continue 
    elif choice == "q": 
     break 
    elif choice == "c": 
     while True: 
      x = int(input("Please enter the number of x: ")) 
      if x >= 0: break 
     while True: 
      y = int(input("Please enter the number of y: ")) 
      if y >= 0: break 
     while True: 
      z = str(input("blah (B) or (P) z?: ")).lower() 
      if z in "bp": break 
     if z == "b": 
      total = x*10 + y*6 + 0 
      print("blah $", total, " blah ", x, " x and ", y, " y. blah!") 
     #function that outputs the cost of premium z 
     else: # z must be "p" 
      luck = random.randrange(1, 11, 1) 
      if luck == 10: 
       total = x*10 + y*6 
       print("\nblah$", total, " blah z for ", x, " x and ", y, " y. blah!") 
      #below is the normal function, for when the customer is not a lucky winner 
      if luck != 10: 
       total = x*12.50 + y*7.50 
       print("blah $", total, " blah ", x, " x and ", y, " y. blah!") 
    else: 
     print("Invalid menu choice.") 
     continue 
+0

http://pastebin.com/Ww4auw7E Я не мог придумать сайт для загрузки, которому я мог бы доверять, но вот пастор кода. Это совсем не сложно, просто пытается понять, что здесь происходит. – Epidemic

+0

Пробовал код с помощью a и вместо – Epidemic

+0

Теперь, когда мне удалось снова запустить IDLE (он отказывается запускать код порой, не совсем уверен, почему), все это работает. Большое спасибо, @TimPietzcker – Epidemic

1

Один способ выполнения операций бросить в Python, чтобы бросить пользовательские исключения и поймать это исключение в явном виде. Пожалуйста, поправьте меня, если я ошибаюсь, AFAIK это не ставит большой над головой в вашу программу python. Это может сделать так же просто, как я покажу ниже:

... 
class QuitException(Exception); 
... 
def MyMenuProgram(): 
    ... 
    ... 
    ... 

if __name__ == '__main__': 
    try: 
     MyMenuProgram() 
    catch QuitException: 
     pass 
    catch Exception, e: 
     raise 
+1

'sys.exit()' уже выбрасывает исключение SystemExit'; почему бы вам создать новый, чтобы сделать то же самое? –

+0

Как я уже сказал, «исправьте меня, если я ошибаюсь» :). Спасибо за эту информацию. Я этого не знал. –

0

Edit: отредактированный - input() действительно способ получить пользовательский ввод в Py3k. Еще одна из славных отличий между Python 2.7 и Python 3.2.

0

Как @Tim ответил, ваше условие цикла неверно.

while choice != "q" or choice != "Q": 

Давайте посмотрим на это логически:

  1. если выбор == "д", выбор = "Q", условие цикла вычисляется в false or true, который true
  2. если! выбор == "Q", выбор! = "д", условие цикла вычисляется в true or false, который true
  3. если выбор! = "д" или "Q", условие цикла вычисляется в true or true, который true

Вы должны изменить это условие цикла к:

while choice != "q" and choice != "Q": 

или

while choice.lower() != "q": 
+0

Я бы пошел дальше и предложил 'while choice [0] .lower()! = 'Q'', чтобы пользователь правильно вводил' quit'. –

+0

@ Li-aungYip, я не думаю, что OP фактически означало, что пользователь вводит «quit», я думаю, что это было просто плохо сформулировано. Однако в случае, когда ожидается этот вход, вы совершенно правы. –

+1

Оборонительная кодировка (почти) никогда не плохая идея. –

Смежные вопросы