大家可能對這個名詞並不熟悉,但是這個名詞所表達的事物卻是我們經常使用到的。只要我們的函式的引數能夠接收函式,或者函式能夠返回函式,當然動態生成的也包括在內。那麼我們就將這類函式叫做高階函式。但是今天我們的標題並不是高階函式,而是標準高階函式,既然加上了這個標準,就意味著在函式式程式設計中有一套標準的函式,便於我們每次呼叫。而今天我們將會介紹三個標準函式,分別為map、filter、fold。
這個函式的作用就是將列表中的每項從a型別轉換到b型別,並形成乙個新的型別。下面我們可以看看在fcslib中是如何實現的:
相信很多人應該都能夠看懂這段**,僅僅只是迴圈list資料。然後呼叫convert函式轉換,最後通過yield將其組成乙個列表返回。下面我們通過乙個簡單的例子來演示下如何使用這個標準高階函式:
我們通過宣告了乙個陣列data,然後利用map函式將其中的id提取出來,單獨形成乙個列表。
通過名字應該能夠猜出他大概的含義了,就是用來過濾資料的。相信一些人能夠根據上面寫出這個標準高階函式的具體實現,當然這裡不管讀者有沒有寫出,我們都來看看fcslib中是如何實現的:
這裡我們只是少了乙個泛型引數,對應的第一引數的是能夠接收t型別返回bool型別的函式(predicate也是.net自帶的,可能我們用慣了func和action,並且利用func也可以實現一樣的效果。),而語句主要是在迴圈後呼叫了predicate去判斷是否滿足條件,如果滿足條件則返回。
這個標準高階函式可能會比較難,因為它分為了左摺疊和右摺疊兩種。接收的引數有三個,分別是起始值,累加函式,列表。大致的執行過程就是在第一次呼叫我們的累加函式時將起始值作為乙個引數,而列表中的第乙個值作為第二個引數去呼叫我們的累加函式,累加函式計算出結果,而這個結果將作為下一次呼叫累加函式時的第一引數,而第二個引數則是列表中的下一項,以此類推。所以通過這個高階函式我們可以直接計算出列表中每項資料累加後的結果,而在fcslib中的具體實現則如下所示:
通過檢視源**我們也可以得出之前的執行流程,在第一次的時候v的值為startvalue,而之後就會將accmulator函式的返回值儲存進v,這樣下一次執行accmulator時就作為第乙個引數傳入。下面我們通過乙個簡單的例子來看看如何使用:
左摺疊完成之後對應的還有乙個右摺疊,當然根據名字也可以猜出。就是從list的末尾開始進行迴圈,所以我們可以這樣來實現foldr:
這裡還要指出的就是左摺疊和右摺疊是最常用的演算法之一,他完全可以實現像我們之前介紹過的map和filter,而只要按照下面這種方式寫即可:
這裡我們就是利用fold函式的乙個特性來實現的,因為累加函式每次都會將上一次計算得出的結果傳遞給下乙個累加函式(new list()我們直接將其作為起始值傳入),最後我們都會通過return x將這個列表返回,這樣下一次再呼叫這個累加函式之後x依然是同乙個列表。對應的還有filter的實現:
而具體的呼叫方式則和map,filter是一致的,並沒有什麼特別大的區別。
其實函式式程式設計已經在不知不覺中慢慢的進入到我們的生活中,其實我們經常在linq中使用的select、where和aggregate就是對應著函式式程式設計中的map、filter和fold。
Python函式式程式設計之高階函式
函式式程式設計,和物件導向程式設計一樣,是現在很流行的一種程式設計正規化。函式式程式設計就是一種抽象程度很高的程式設計正規化,純粹的函式式程式語言編寫的函式沒有變數,因此,任意乙個函式,只要輸入是確定的,輸出就是確定的,這種純函式我們稱之為沒有 而允許使用變數的程式語言,由於函式內部的變數狀態不確定...
Python函式式程式設計之高階函式
高階函式英文叫higher order function。什麼是高階函式?我們以實際 為例子,一步一步深入概念。以python內建的求絕對值的函式abs 為例,呼叫該函式用以下 abs 10 10但是,如果只寫abs呢?abs infunction abs 可見,abs 10 是函式呼叫,而abs是...
Python函式式程式設計之高階函式
把函式當成變數來用,乙個函式接收另外乙個函式作為引數,這樣的函式叫做高階函式 higher order functions 高階函式 首先自己定義乙個函式,平方函式 def square x return x x 定義乙個可以將函式作為引數傳入 也可以將乙個資料儲存結構作為引數傳入的函式 def f...