2014-03-01 16 views
0

Python新手,我想創建一個函數,提示用戶輸入並檢查它是否是可接受的輸入(有一個可用的輸入列表)。如果可以接受 - 返回輸入。如果沒有 - 再次提示用戶,直到他提供可接受的輸入。將return放入使用raw_input並驗證輸入的函數的位置?

這是我用什麼:

def get_choice(): 
possible_choices = ["option1","option2","option3","option4"] 
choice = raw_input("Please enter your choice: ").lower() 
if choice not in possible_choices: 
    print "Sorry, please try again" 
    return get_choice()   # if not an acceptable answer - run the function again      

return choice 

現在,這個工程。 我想知道的是if條件爲True時的返回命令。 直觀地說,我沒有將返回放在那裏,只是再次調用函數,如果用戶沒有輸入可接受的條目,它會再次運行它。但是,函數本身會返回用戶輸入的原始值,可接受與否。只有當我在再次調用函數之前添加了返回值,它纔開始正常工作。

任何人都可以解釋這是爲什麼嗎?當再次調用函數時,選擇現在將指向新的用戶輸入,而不是第一個。

我得到了主意,從Abrixas2的回答有加回到這個問題:
Python getting user input errors

然而,在這裏:Continually prompting user for input in Pythonaudionautics的答案的一部分,涉及到類似的問題,他認爲這樣的功能:

def get_input_number(): 
    num = int(raw_input("Enter a positive integer no greater than 42 ")) 
    if num <= 0 or num > 42: 
     print "Invalid input. Try again " 
     get_input_number() 
    else: 
     return num 

顯然,輸入需要由比我其他的標準進行驗證,但你會發現問題的本質是一樣的。在再次調用函數之前,他沒有返回語句。我試着一起運行這個代碼:

test = get_input_number() 
print test 

打印結果,它什麼都沒有返回。我提出這個問題的原因是它仍然有3個upvotes(對於這個問題大多數提議),所以當我研究這個問題時我不想一起解僱它。

無論如何,底線,有人可以請解釋什麼是正確的方式去了解它,爲什麼我的函數沒有在if條件中的return語句返回用戶輸入的第一個值?

感謝:D

+0

使用循環,而不是遞歸... – isedev

回答

2

您正在使用遞歸;你再次調用函數本身。每個函數調用都有自己的獨立名稱;遞歸調用得到一個新的choice變量,當前主體中的一個不會改變。

if choice not in possible_choices: 
    print "Sorry, please try again" 
    return get_choice() 

該函數的遞歸調用返回的東西,如果你沒有返回任何遞歸調用返回,你會忽略它;不管嵌套的get_choice()返回什麼都沒有。

這一呼籲之前,choice變量集合仍然是舊的,錯誤的價值,因爲它是獨立於遞歸調用的choice價值。

你也可以這樣做:

if choice not in possible_choices: 
    print "Sorry, please try again" 
    choice = get_choice() 

return choice 

例如將當前choice設置爲返回值,因此本地choice現在將反映遞歸調用返回的內容。

但是,您不應該使用遞歸來請求用戶輸入。改用循環。一個循環可以無限期地繼續,而遞歸調用最終會耗盡堆棧空間。一個固執的用戶會違反你的程序:

def get_choice(): 
    while True: 
     possible_choices = ["option1","option2","option3","option4"] 
     choice = raw_input("Please enter your choice: ").lower() 
     if choice in possible_choices: 
      return choice 
     print "Sorry, please try again" 

這裏return將結束循環,退出功能。如果你不回來,循環會繼續進行,用戶必須做出正確的選擇。

+0

非常感謝! :)我認爲我更好理解(很難想象這個過程),而且你建議的選擇是優雅而好看的:) 那麼,是我引用的另一個答案,並且提到的只是錯誤的,或者是否有情況會持有?它並不是如此,但仍然想知道如果它不正確,它是如何得到提升的。 – Optimesh

+0

我不確定用戶輸入的遞歸模式來自哪裏。你提到的帖子沒有那麼多讚揚;他們確實解決了這個問題,並且您鏈接的頁面上的其他答案使用循環而不是遞歸。 –

+1

換句話說,這些投票是在這些帖子上,因爲答案被認爲對某些人有幫助,但這並不一定驗證該技術。在Stack Overflow的用戶輸入中有很多**帖子,所以對這些答案的投票也相當稀釋。 –