2016-12-30 39 views
-2

兩個函數都使用相同的check(x)函數,並且幾乎相同,但第二個函數必須採用的參數才能使用print。輸入int作爲輸入顯示沒有問題。錯誤檢查後,函數返回「NoneType」,但不包含另一個輸入

但是,如果輸入了字母,則enter_num()的返回結果將變爲NoneType,但這在enter_amount()中不會發生。

哪裏出了點問題?

def check(x):       #check if user input is integer 
    try: 
     int(x) 
     return True 
    except ValueError: 
     return False 

def enter_num():      #get user input for lotto numbers 
    x = input("buy num:") 
    if check(x) == True:    #check int 
     x = int(x) 
     return x       
    else: 
     print("Please enter integer") 
     enter_num() 

def enter_amount(x):     #get user amount of the lottos 
    print(x)       ##if enter_num errored once, this will show None## 
    y = input("How many?") 
    if check(y) == True:    #check int 
     y = int(y) 
     print("%s for %s copies" % (x,y)) 
     return y 
    else: 
     print("Please enter integer") 
     enter_amount(x)     

buy_num = enter_num() 
amount = enter_amount(buy_num) 
+0

什麼是*你得到異常的完整回溯*請不要讓我們猜到這個! –

+0

沒有跡象顯示,因爲它運行沒有錯誤。 –

+0

您對'NoneType'一詞的使用表明您在某處獲得了一個異常*,就像'AttributeError:'NoneType'對象沒有屬性'something'一樣。 –

回答

6

你永遠不會從enter_num()返回遞歸結果:

def enter_num(): 
    x = input("buy num:") 
    if check(x) == True: 
     x = int(x) 
     return x       
    else: 
     print("Please enter integer") 
     enter_num() # ignoring the return value 
    # so None is returned instead 

這同樣適用於enter_amount();它也忽略遞歸調用。

您需要明確地返回遞歸調用的結果,就像你會爲任何其他表達式:

def enter_num(): 
    x = input("buy num:") 
    if check(x) == True: 
     x = int(x) 
     return x       
    else: 
     print("Please enter integer") 
     return enter_num() # ignoring the return value 

執行相同的enter_amount();將最後一行更改爲return enter_amount(x)

但是你真的不應該使用遞歸;所有用戶所要做的就是按住ENTER鍵一段時間,讓代碼最終打破遞歸限制。有關更好的技術,請參閱Asking the user for input until they give a valid response;在這裏,while循環會很好。

也不需要測試== True; if已經檢驗真理:

if check(x): 

我還內聯check測試;如果字符串可以轉換,則無需轉換爲int()兩次。下面將沒有用完遞歸深度的,但只是返回int(x)直接,如果x包含敞篷值,否則打印錯誤消息和循環右後衛再次要求人數:

def enter_num(): 
    while True: 
     x = input("buy num:") 
     try: 
      return int(x) 
     except ValueError: 
      print("Please enter integer") 
+0

謝謝。我任意假設,如果它只是一個迴環,那麼代碼不需要返回任何東西。 –

相關問題