2013-02-24 2 views
0
def Help(string): 
    while True: 
     if string == 'Manifest': 
      return Manifest() 
      break 
     elif string == 'Intent': 
      return Intent() 
      break 
     else: 
      print('The options available are: \n') 
      for i in andHelp: 
       print(i) 
      print('Type Q to Quit \n') 
      x = input('What option do you choose: ') 
      print('\n') 
      if x == 'Q': 
       break 
      else: 
       Help(x) 

Как получилось, что если оно поступит в инструкцию else, оно продолжит цикл? , например:Петля продолжается после выполнения

"Доступные опции:

Намерение

Manifest

Тип Q Бросить

Какой вариант вы выбираете:" < - это будут приходить а также функцию, которую я выбираю.

+0

Как метод вошел в первую очередь? –

+0

Потому что это постоянный, бесконечный цикл. – Linuxios

+0

перерыв не заставит его остановиться? – Dobz

ответ

1

Вам даже не нужен цикл while для того, что вы проверяете. Используйте вместо этого:

def Help(string): 
    if string == 'Manifest': 
     return Manifest() 
    elif string == 'Intent': 
     return Intent() 
    else: 
     print('The options available are:\n%s\nType Q to Quit\n' % '\n'.join(andHelp)) 
     x = input('What option do you choose: ') 
     print('\n') 
     if x != 'Q': 
      Help(x) 

Примечание: Я изменил отпечатки немного уменьшить дополнительные линии, которые на самом деле, не нужно быть там.
примечание2: Как вы можете видеть в комментариях, это может быть опасно сделать это рекурсивно без ограничений, поскольку вы можете достичь максимального уровня глубины.

+2

Да, что происходит, когда я вхожу в «кошачий мочу» 1001 раз. ваша программа взрывается! –

+0

Спасибо! Просто немного новичок в Python, поэтому я не вижу очевидных ответов. :) Благодаря! – Dobz

+0

@JakobBowyer Извините, но это не ошибка, это дизайн. Если OP хочет ограничить попытки повтора, который является его выбором, в его нынешнем виде код выполняет то, что ожидает OP, продолжать запрашивать ввод до ввода «Q» или «Manifest» или «Intent». Несмотря на это, постоянный ввод '' cat pee'' ничего не взорвет, просто очень долгий раздражающий цикл. –

1

Ваша фактическая проблема связана с тем, что ваша рекурсия фактически не возвращает значение внутреннего фрейма, но устранение рекурсии кажется более простым решением.

То, что об этом говорит, это рекурсия внутри цикла. Как рекурсия, так и цикл служат той же цели: сделать выбор option, пока не будет указан действительный параметр. Таким образом, вы можете определенно устранить одно:

def Help(string): 
    while True: 
     if string == 'Manifest': 
      return Manifest() 
      break 
     elif string == 'Intent': 
      return Intent() 
      break 
     else: 
      print('The options available are: \n') 
      for i in andHelp: 
       print(i) 
      print('Type Q to Quit \n') 
      string = input('What option do you choose: ') # Change `x` to `string` so next iteration will change behavior 
      print('\n') 
      if string == 'Q': 
       break 

Как Inbar Rose's answer точки, вы можете сократить это совсем немного с рекурсией, но, поскольку Python требует ограничения рекурсии, вы можете сделать сбой программы, заставляя его повторялись за что предел. Так что, возможно, придерживаться петли лучше. Во всяком случае, вы можете очистить его дальше, имея подтверждение string быть условием самого цикла:

def Help(string): 
    validOptions = ('Manifest', 'Intent', 'Q') 

    while string not in validOptions: 
     print('The options available are: \n') 
     for i in andHelp: 
      print(i) 
     print('Type Q to Quit \n') 
     string = input('What option do you choose: ') 
     print('\n') 

    # Now you have a guaranteed-valid string, so you don't need this part in the loop. 
    if string == 'Manifest': 
     return Manifest() # No need for a 'break' after a return. It's [dead code](http://en.wikipedia.org/wiki/Dead_code) 
    elif string == 'Intent': 
     return Intent() 
    elif string == 'Q': 
     return 
+0

Спасибо :) Всегда ищет улучшенный код :) – Dobz

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