[英]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.