2014-10-19 101 views
-1

我正在研究一個簡單的想法,以便更好地掌握Python。雖然我遇到了麻煩。在Python中使用函數作爲另一個函數的參數3.4.2

這裏是我的代碼:

def backToMain(f): 
    print('Back to Main Menu (B)') 
    back = input('>>>') 
    back = back.lower() 
    if back == 'b': 
     mainMenu() 
    else: 
     print('\nThat is not a valid input.\n\n') 
     f 

def instruct(): 
    instructtxt= str('INSTRUCTIONS') 
    instructlen = len(instructtxt) * 6 
    print(instructtxt.center(instructlen,'~')) 
    backToMain(instruct()) 

我試圖去發生的是,這樣每次用戶不是在主菜單(即指令,信貸等),系統會提示他們與底部的文本「返回主菜單」,如果按下「b」鍵,它們將返回到mainMenu()函數中。如果不是這樣,他們被告知這是不是一個有效的輸入,並帶回函數開始他們目前英寸

的問題是,雖然,因爲我想在多個其他功能backToMain()函數,當用戶在提示符下輸入除'b'以外的任何內容時,它們將被帶到它們試圖退出的函數的開頭。目前發生的事情是,一旦你進入教導()的印刷語句就重複自己無限。

有人認爲他們可以幫我嗎?如果我不清楚,請告訴我,我會盡力澄清。

謝謝!

+0

請修正您的代碼中的縮進。 – BrenBarn 2014-10-19 23:26:02

+0

感謝@BrenBarn,它是固定的。儘管代碼在實際腳本中正確縮進,但縮進並不是問題。 – ryanhagz 2014-10-19 23:34:17

回答

0

您在錯誤的地方使用括號。當你寫instruct()時,你可以撥打instruct()。當你調用一個函數時,它的參數在被調用之前被評估。所以,當你做backToMain(instruct()),它叫instruct()爲了通過它的返回值作爲參數,這意味着它再次調用instruct,再次調用它,等

傳遞給函數本身(而不是它的返回值),請做backToMain(instruct)

backToMain你有相反的問題。最後你需要做f()f本身只是對函數的引用,而不是調用,所以它不會做任何事情。要調用一個函數,你需要使用圓括號;傳遞你不需要使用括號的函數對象。

這就是說,這不是一個很好的方法來做到這一點。它創建了很多遞歸調用。如果用戶輸入了很多無效的輸入,他可能會遇到遞歸限制。很難說在不瞭解程序的整體結構的情況下如何更好地做到這一點,但總的來說,最好避免遞歸作爲一種「重新開始」的技術。你應該更喜歡一個循環。

+0

謝謝,這正是問題所在。現在,請原諒無知,但這種技術如何創建遞歸調用?此外,像在當前循環中粘貼當前代碼那樣簡單的問題解決了這個問題? – ryanhagz 2014-10-19 23:53:26

+0

@ryanhagz:假設你調用'instruct'。然後它調用'backToMain'。如果用戶輸入無效的輸入,'instruct'將再次被調用。這是一個遞歸調用(儘管是間接的)。另外,如果用戶從'mainMenu'做出了一些選擇,然後以某種方式返回到'backToMain'並且擊中了b,'mainMenu'將被再次調用(遞歸)。基本上,用戶每次執行某些操作時,都會重新調用相關的函數,而不是返回已調用的函數。 – BrenBarn 2014-10-19 23:55:32

相關問題