首先有乙個高階函式的知識。
乙個函式可以接收另乙個函式作為引數,這種函式就稱之為高階函式。
def add(x, y, f):return f(x) +f(y)
當我們呼叫add(-5, 6, abs)時,引數x,y和f分別接收-5
,6和abs,根據函式定義,我們可以推導計算過程為:
等價於:
x = -5
y = 6
f =abs
f(x) + f(y) ==> abs(-5) + abs(6) ==> 11
return
11print(add(-5, 6
, abs))
>>11
這裡涉及到的概念:
變數可以指向函式如果乙個變數指向了乙個函式,那麼,可否通過該變數來呼叫這個函式?用**驗證一下:以python內建的求絕對值的函式abs()為例,呼叫該函式用以下**:
>>> abs(-10)10
但是,如果只寫abs呢?
>>>abs
in function abs>可見,abs(-10
)是函式呼叫,而abs是函式本身。
要獲得函式呼叫結果,我們可以把結果賦值給變數:
>>> x = abs(-10
)>>>x
10但是,如果把函式本身賦值給變數呢?
>>> f =abs
>>>f
in function abs>結論:函式本身也可以賦值給變數,即:變數可以指向函式。
>>> f = abs
>>> f(-10)
10
成功!說明變數f
現在已經指向了abs
函式本身。直接呼叫abs()
函式和呼叫變數f()
完全相同。
函式名也是變數那麼函式名是什麼呢?函式名其實就是指向函式的變數!對於abs()這個函式,完全可以把函式名abs看成變數,它指向乙個可以計算絕對值的函式!
如果把abs指向其他物件,會有什麼情況發生?
>>> abs = 10
>>> abs(-10
)traceback (most recent call last):
file
"", line 1, in
typeerror:
'int
'object
isnot callable
把abs指向10後,就無法通過abs(-10
)呼叫該函式了!因為abs這個變數已經不指向求絕對值函式而是指向乙個整數10!
當然實際**絕對不能這麼寫,這裡是為了說明函式名也是變數。要恢復abs函式,請重啟python互動環境。
注:由於abs函式實際上是定義在import builtins模組中的,所以要讓修改abs變數的指向在其它模組也生效,要用import builtins; builtins.abs = 10。
python高階一 高階函式
1 函式式程式設計 python特點 不是純函式式程式設計 允許變數存在 支援高階函式 可以傳入函式作為變數 支援閉包 可以返回函式 有限度的支援匿名函式 高階函式 變數可以指向函式 函式的引數可以接收變數 乙個函式可以接收另乙個函式作為引數 def add x,y,f return f x f y...
python高階學習筆記(一) 高階函式
filter filter 函式接收乙個 函式 f 和乙個list 這個函式 f 的作用是對每個元素進行判斷,返回 true或 false,filter 根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。例如,要從乙個list 1,4,6,7,9,12,17 中刪除偶數,保...
python函式式程式設計模式 python函式式程式設計
1 callable內建函式判斷乙個名字是否為乙個可呼叫函式 import math x 1 y math.sqrt callable x false callable y true 2 記錄函式 文件字串 def square x calculates the square of number x...