def print_n(s,n):
for i in range(n):
print(s)
def do_n(f,n):
for i in range(n):
f()
do_n(print_n("hello",3),4)
預期會印出 12 個 hello。
def print_n():
for i in range(n):
print("hello")
def do_n(f,n):
for i in range(n):
f()
do_n(print_n,4)
程式可以漂亮的執行,但就做不到在print_n()引入一個s字串,資料顯示,python 的函式是一級函式,如果在無遞迴版本中,do_n(f,n)函式中的f(),是空的,do_n(print_n("hello",3),4),會把 print_n("hello",3),的結果傳回來,就沒有然後了,他會不知道print_n("hello",3)意指f()。
附註:本題目在think python一書中,的第60頁
4/22:
我做出來了,
def print_n(s,n):
for i in range(n):
print(s)
def do_n(f,n):
for i in range(n):
f("hello",5)
do_n(print_n,4)
這樣就可以達成題目要求了
def printHello():
print("hello")
def do_n(callback, n=0):
if n >= 0:
for i in range(0, n):
callback()
else:
print("n must greater than 0")
do_n(printHello, 5)
如果callback要輸入函數的話,得考慮用裝飾子。
這種不用用到遞迴。
注意:
do_n(printHello, 5)
do_n(printHello(), 5)
是不同的,看清楚其中的分別。
沒加刮號的是函式本身,加了則是函式的執行結果。
也就是說加了刮號的是函式return後的。
補充說明:
需要傳參數進printHello時,可參考
https://stackoverflow.com/questions/13783211/python-how-to-pass-an-argument-to-a-function-pointer-parameter
其中 lambda 的方式就是簡寫的裝飾子
partial 也很好用(其實內部也是用裝飾子實現)。
Python中函式的變數可以帶入函式嗎?
這是在哪個地方看到的呢?
froce
什麼叫做一級公民?
好奇試了一下,
這樣比較有遞迴的感覺
def print_n(s,n, m):
if n > 0:
print(s+ format(n) + "_" + format(m))
return print_n(s, n - 1, m)
else: return 0
def do_n(f, s, n, m):
if m > 0:
f(s, n, m)
return do_n(f, s, n, m-1)
else: return 0
do_n(print_n, "hello", 3 ,4)
另外, 遞迴是要return值的...
看大師講應該會比我說的清楚:
python傳遞函式和js很像。
https://www.ithome.com.tw/node/75500
說真的,我很慶幸第一個語言學的是python,因為JS一半的坑在python都學過了。XD
然後這樣寫有個不太好的地方是耦合度太高,如果我今天print_n輸入參數改變,do_n那邊也得跟著變。