python學習(四) 函式式程式設計

2021-07-10 17:31:05 字數 2185 閱讀 7172

函式是python內建支援的一種封裝,我們通過把大段**拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計(請注意多了乙個「式」字)—functional programming,雖然也可以歸結到面向過程的程式設計,但其思想更接近數學計算。

函式式程式設計就是一種抽象程度很高的程式設計正規化,純粹的函式式程式語言編寫的函式沒有變數,因此,任意乙個函式,只要輸入是確定的,輸出就是確定的,這種純函式我們稱之為沒有***。而允許使用變數的程式語言,由於函式內部的變數狀態不確定,同樣的輸入,可能得到不同的輸出,因此,這種函式是有***的。函式式程式設計的乙個特點就是,允許把函式本身作為引數傳入另乙個函式,還允許返回乙個函式!

python對函式式程式設計提供部分支援。由於python允許使用變數,因此,python不是純函式式程式語言。

在計算機的層次上,cpu執行的是加減乘除的指令**,以及各種條件判斷和跳轉指令,所以,組合語言是最貼近計算機的語言。而計算則指數學意義上的計算,越是抽象的計算,離計算機硬體越遠。對應到程式語言,就是越低階的語言,越貼近計算機,抽象程度低,執行效率高,比如c語言;越高階的語言,越貼近計算,抽象程度高,執行效率低,比如lisp語言。

函式本身也可以賦值給變數,即:變數可以指向函式。那麼函式名是什麼呢?函式名其實就是指向函式的變數。

既然變數可以指向函式,函式的引數能接收變數,那麼乙個函式就可以接收另乙個函式作為引數,這種函式就稱之為高階函式。函式式程式設計就是指這種高度抽象的程式設計正規化。

1. map:該函式接收兩個引數,乙個是函式,乙個是iterable,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的iterator返回

2. reduce把乙個函式作用在乙個序列[x1, x2, x3, …]上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下乙個元素做累積計算,其效果就是:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4).

3.filter:python內建的filter()函式用於過濾序列。和map()類似,filter()也接收乙個函式和乙個序列。和map()不同的時,filter()把傳入的函式依次作用於每個元素,然後根據返回值是true還是false決定保留還是丟棄該元素。可見用filter()這個高階函式,關鍵在於正確實現乙個「篩選」函式。

4. sorted:排序也是在程式中經常用到的演算法。無論使用氣泡排序還是快速排序,排序的核心是比較兩個元素的大小。如果是數字,我們可以直接比較,但如果是字串或者兩個dict呢?直接比較數學上的大小是沒有意義的,因此,比較的過程必須通過函式抽象出來。sorted()函式也是乙個高階函式,它還可以接收乙個key函式來實現自定義的排序。key指定的函式將作用於list的每乙個元素上,並根據key函式返回的結果進行排序。要進行反向排序,不必改動key函式,可以傳入第三個引數reverse=true。用sorted()排序的關鍵在於實現乙個對映函式。

高階函式除了可以接受函式作為引數外,還可以把函式作為結果值返回;

返回乙個函式時,牢記該函式並未執行,返回函式中不要引用任何可能會變化的變數。

python閉包(closure):其實並不是什麼很複雜的東西通俗的講就是,如果在乙個內部函式裡,對在外部作用域(但不是在全域性作用域)的變數進行引用,那麼內部函式就被認為是閉包(closure)。它只不過是個「內層」的函式,由乙個名字(變數)來指代,而這個名字(變數)對於「外層」包含它的函式而言,是本地變數。乙個函式和它的環境變數合在一起,就構成了乙個閉包(closure)。在python中,所謂的閉包是乙個包含有環境變數取值的函式物件。環境變數取值被儲存在函式物件的closure屬性中。

關鍵字lambda表示匿名函式,冒號前面的x表示函式引數。匿名函式有個限制,就是只能有乙個表示式,不用寫return,返回值就是該表示式的結果,如:匿名函式lambda x: x * x。用匿名函式有個好處,因為函式沒有名字,不必擔心函式名衝突。此外,匿名函式也是乙個函式物件,也可以把匿名函式賦值給乙個變數,再利用變數來呼叫該函式。同樣,也可以把匿名函式作為返回值返回。所謂匿名,意即不再使用def語句這樣標準的形式定義乙個函式。這種語句的目的是由於效能的原因,在呼叫時繞過函式的棧分配。其語法是:

lambda [arg1[, arg2, … argn]]: expression

其中,引數是可選的,如果使用引數的話,引數通常也會在表示式之中出現。

python學習筆記(四) 函式式程式設計

1 高階函式 高階函式 higher order function 1 變數可以指向函式 函式本身也可以賦值給變數。2 函式名也是變數 指向函式的變數。3 傳入函式 變數能夠指向函式,函式的引數能接收變數,乙個函式就可以接收另乙個函式作為引數。接收兩個引數 函式,iterable map 將傳入的函...

四 Python函式式程式設計 學習筆記

1 map reduce函式 map 函式,iterable 把傳入的函式依次作用在序列的每個元素上,並將結果作為乙個新的iterable返回。例子 使用者輸入的英文名字,首字母大寫,其他小寫 coding utf 8 def normalize name return name 0 upper n...

Python學習 函式式程式設計

高階函式除了可以接受函式作為引數外,還可以把函式作為結果值返回。我們來實現乙個可變引數的求和。通常情況下,求和的函式是這樣定義的 def calc sum args ax 0 for n in args ax ax n return ax 但是,如果不需要立刻求和,而是在後面的 中,根據需要再計算怎...