簡體   English   中英

使用作為參數傳入的函數對象定義函數

[英]Defining function with function object passed in as argument

我正在使用互聯網自學一些有用的內容,例如python。 到目前為止,我一直在使用Downey的“ Think python”和Lutz的“ Learning Python”資源。 我是最初接觸python的Udacity計算機科學程序的入門者,並且一直從這里開始自學。我是一名編碼新手,這是我嘗試學習的第一門語言。

我的問題是Downey在“ think python”中提出的,並且正在定義一個函數,該函數將函數對象作為參數之一以及數字n。

它是在遞歸編程章節中介紹的,一直給我小貓。

到目前為止,我的代碼:

    def print_string(s):
        print (s)
        return

    def do_n(f , n):
        if n <=0:
            return
        f
        do_n(f, n-1) 

現在,我一直在嘗試使用名為print_ string的簡單預定義打印函數,該函數接受參數。

我將腳本保存在一個名為recursive.py的文件中,並在IDLE中運行,然后在運行后,使用以下do_n(print_string('test'),6)調用do_n。

我希望將示例字符串“ test”打印6次,但僅打印一次。 似乎沒有遞歸。

我究竟做錯了什么? 任何幫助將不勝感激,因為我真的負擔不起Udacity或其他任何東西的注冊,這僅僅是我&互聯網vs python。 TIA

嗨,這是我最終實際使用的最終代碼。

    def print_string():
        print ('result')
        return
    def do_n(f, n):
        if n <=0:
            return
        print(type(f))
        f()
        print('been here')
        do_n(f, n-1) 

    do_n(print_string, 6)

插入了兩個“ been here”和type(f)的打印調用,以嘗試了解程序發生了什么,並且不需要在那里,但我想提醒自己已經取得了飛躍-因此他們待在里面。

我想你已經很近了。 我認為問題出在您對方法中的f的調用上。 別忘了-您將函數傳遞為f ,而不是函數調用 因此,當do_n函數中包含f時,它什么也不做。 如果執行了f() ,它將實際上調用f(不帶任何參數,這可能會或不允許),並且如果執行f(n)則可能會調用帶有n作為參數的print_string 我模擬了一個小演示讓您開始:

def print_string(arg1=''):
    # mimicing your "pre-defined" function
    # Note I've put a default value in arg1 so that you
    # can call it without an argument to illustrate the priciple
    print(arg1)    

def do_n(f , n):
    if n <=0:
        return
    f('test')         # This is the line that was close, but not quite right
    do_n(f, n-1)

do_n(print_string,10)

*編輯*

為了響應OP在編輯中的澄清。 原始代碼與原始帖子相同,但用以下行調用

do_n(print_string('test'),6)

問題在於,在您輸入do_n之前,就存在print_string()函數。 由於print_string()函數只是打印給出的內容(我假設)並且不返回任何內容-您實際上是將None傳遞給do_n函數。

do_n ,並說服自己在do_n之前已對print_string進行了評估-嘗試對原始do_n進行一次更改以說

do_n(print_string('test'),0)

您可能希望什么都看不到,但是實際上您會看到輸出test因為仍然調用print_string。

要將一個函數傳遞給另一個函數,請傳遞其名稱,但不要在其后加上任何方括號或參數。 這樣,您傳遞的是函數對象,而不是調用該函數的結果。

您實際上是從接收函數內部調用該函數(或實際上將其傳遞給另一個函數)。 我上面的示例代碼仍然存在。 注意-我傳入的print_string沒有括號或參數。

這是一項強大的技術-可能需要花點時間思考,但這樣做是值得的。 根據經驗,如果您看到函數名稱后沒有方括號,則會將其作為函數對象傳遞。 如果后面有方括號,則表示正在對此進行評估。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM