2014-09-26 90 views
0

我試圖檢查raw_input是使用下面的碼連續3 1選項的選擇:從包含函數中返回變量如果ELIF else語句

def selectDiff(): 
    upperbound = 0 
    difficulty = ['easy', 'medium', 'hard'] 
    diff = raw_input(' or '.join(difficulty)).lower() 
    if diff in difficulty: 
     if diff == 'easy': 
      upperbound = 20 

     elif diff == 'medium': 
      upperbound = 25 

     elif diff == 'hard': 
      upperbound = 30 

    else: 
     print "Please select easy, medium or hard\n" 
     selectDiff() 

    return upperbound 

如果用戶從難度列表輸入一個值['easy','medium','hard']該函數按我的意願工作,但如果用戶首先輸入列表中未包含的值,那麼當它們最終輸入在列表中找到的值時,變量upperbound將返回爲0.我試着移動return語句,但結果是相同的,或者由於在變量被拒絕之前引用變量而出現錯誤。

是否有可能改變我的方法來產生所需的行爲,還是應該使用另一種方法?

回答

4

使用一個while循環,該循環繼續輸入,直到用戶輸入正確的輸入。

def selectDiff(): 
    difficulty = ['easy', 'medium', 'hard'] 
    while True: 
     diff = raw_input('easy, medium or hard').lower() 
     if diff in difficulty: 
      if diff == 'easy': 
       return 20 
      elif diff == 'medium': 
       return 25 
      elif diff == 'hard': 
       return 30  
     else: 
      print "Please select easy, medium or hard\n" 
3

你打電話給selectDiff(),然後忽略返回值。你最好使用循環而不是無限遞歸。

像這樣的實例:

def selectDiff(): 
    while True: 
     diff = raw_input('easy, medium or hard').lower() 
     if diff=='easy': 
      return 20 
     if diff=='medium': 
      return 25 
     if diff=='hard': 
      return 30 
     print "Please select easy, medium or hard\n" 
5

我同意使用循環可能更有意義在這裏,但如果你想使用遞歸保留,只是將upperbound到內selectDiff的結果。

def selectDiff(): 
    difficulty = ['easy', 'medium', 'hard'] 
    diff = raw_input(' or '.join(difficulty)).lower() 

    if diff in difficulty: 
     if diff == 'easy': 
      upperbound = 20 
     elif diff == 'medium': 
      upperbound = 25 
     elif diff == 'hard': 
      upperbound = 30 
    else: 
     print "Please select easy, medium or hard\n" 
     upperbound = selectDiff() # Use the returned value 

    return upperbound 

在一個側面說明,你也可以使用一個dict更換elif鏈,使之更容易一點擴展。

def selectDiff(): 
    difficulty = { 
     'easy': 20, 
     'medium': 25, 
     'hard': 30, 
    } 

    diff = raw_input(' or '.join(difficulty)).lower() 
    try: 
     return difficulty[diff] 
    except KeyError: 
     print "Please select easy, medium or hard\n" 
     return selectDiff() 
0

我想是你所希望做的,是讓upperbound動態範圍的閉包變量,即使你可能不知道這些詞的意思。這是行不通的,因爲Python不會執行動態範圍界定(也不適用於大多數其他現代語言),並且在3.x之前,如果分配給它們,Python閉包變量不起作用。

但是,您可以模擬要通過仔細使用全局變量,或(更好)詞法範圍的變量的作用域,並且可以通過存儲內的另一個可變變量的變量賦值模擬。所以:現在

def selectDiff(): 
    upperbound = [0] 

    def realSelectDiff(): 
     difficulty = ['easy', 'medium', 'hard'] 
     diff = raw_input(' or '.join(difficulty)).lower() 
     if diff in difficulty: 
      if diff == 'easy': 
       upperbound[0] = 20 

      elif diff == 'medium': 
       upperbound[0] = 25 

      elif diff == 'hard': 
       upperbound[0] = 30 

     else: 
      print "Please select easy, medium or hard\n" 
      realSelectDiff() 

    realSelectDiff() 
    return upperbound[0] 

,每次調用realSelectDiff未設定upperbound的本地副本,他們都設置upperbound值的外selectDiff的副本。

所有這些都說了,這幾乎不是一個好主意。如果你想使用遞歸,你幾乎總是想把值傳遞給堆棧,並且你不想使用遞歸模擬循環。但值得理解這是如何工作的。

+0

更好更簡單的答案存在 - 就像使用while或直接遞歸 - 這只是普通的複雜,沒有明顯的原因。 – 2014-09-26 22:42:56

+0

@ TonySuffolk66:這回答了OP的問題,並表明他有可能做他想做的事情,也表明這並不容易,這表明他不應該這樣做。只要給他不同的代碼,並說「這樣做」並不能幫助他學習,而說謊並說「這是不可能的」,如果它幫助更少。 – abarnert 2014-09-26 23:01:43