2013-02-24 256 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語句,它將保持循環? 例如:循環繼續進行後

「提供的選項包括:

意向

清單

鍵入q退出

你選擇什麼樣的選項:」 < - 這將滾滾而來以及我選擇的功能。

+0

方法是如何進入的? – 2013-02-24 15:21:09

+0

因爲它是一個常數,無限循環。 – Linuxios 2013-02-24 15:21:12

+0

會不會讓它停止? – Dobz 2013-02-24 15:23:03

回答

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) 

注:我修改上設置打印位,以減少真正的,也沒必要在那裏多餘的線條。
note2:正如您在評論中可能看到的那樣,由於您可能會達到最大深度級別,因此遞歸執行此操作可能會非常危險。

+2

是的,當我進入「貓尿」1001次會發生什麼。你的程序爆炸了! – 2013-02-24 15:26:37

+0

謝謝!對Python來說有點新鮮,所以我沒有看到明顯的答案。 :) 謝謝! – Dobz 2013-02-24 15:27:18

+0

@JakobBowyer對不起,但這不是一個錯誤,它是設計。如果OP想要限制他所選擇的重試嘗試,那麼代碼將執行OP所期望的操作,直到輸入'Q'或'Manifest'或'Intent',纔會繼續詢問輸入。無論如何,不​​斷輸入「貓尿」不會爆炸任何東西,只是一個非常漫長的煩人循環。 – 2013-02-24 15:30:18

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 2013-03-06 23:51:55