函式式程式設計就是一種抽象程度很高的程式設計正規化,純粹的函式式程式語言編寫的函式沒有變數,因此,任意乙個函式,只要輸入是確定的,輸出就是確定的,這種純函式我們稱之為沒有***。而允許使用變數的程式語言,由於函式內部的變數狀態不確定,同樣的輸入,可能得到不同的輸出,因此,這種函式是有***的。
函式式程式設計的乙個特點就是,允許把函式本身作為引數傳入另乙個函式,還允許返回乙個函式!
python對函式式程式設計提供部分支援。由於python允許使用變數,因此,python不是純函式式程式語言。
一、高階函式
函式本身也可以賦值給變數,即:變數可以指向函式。
函式名其實就是指向函式的變數
乙個函式就可以接收另乙個函式作為引數,這種函式就稱之為高階函式。
def add(x, y, f):
return f(x) + f(y)
二、map
map()函式接收兩個引數,乙個是函式,乙個是iterable,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的iterator返回。
>>> def f(x):
... return x * x
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
三、reduce
reduce把乙個函式作用在乙個序列[x1, x2, x3, ...]上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下乙個元素做累積計算
>>> from functools import reduce #對乙個序列求和
>>> def add(x, y):
... return x + y
>>> reduce(add, [1, 3, 5, 7, 9])
四、filter(篩選)
python內建的filter()函式用於過濾序列。
和map()類似,filter()也接收乙個函式和乙個序列。和map()不同的是,filter()把傳入的函式依次作用於每個元素,然後根據返回值是true還是false決定保留還是丟棄該元素。(根據函式返回值的結果來過濾序列)
例如,在乙個list中,刪掉偶數,只保留奇數,可以這麼寫:
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 結果: [1, 5, 9, 15]
五、排序
python內建的sorted()函式就可以對list進行排序,sorted()函式也是乙個高階函式,它還可以接收乙個key函式來實現自定義的排序
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
高階函式的抽象能力是非常強大的
>>> sorted(['bob', 'about', 'zoo', 'credit'], key=str.lower, reverse=true)
['zoo', 'credit', 'bob', 'about']
六、返回函式
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
在這個例子中,我們在函式lazy_sum中又定義了函式sum,並且,內部函式sum可以引用外部函式lazy_sum的引數和區域性變數,當lazy_sum返回函式sum時,相關引數和變數都儲存在返回的函式中,這種稱為「閉包(closure)」的程式結構擁有極大的威力。
返回閉包時牢記一點:返回函式不要引用任何迴圈變數,或者後續會發生變化的變數。
七、匿名函式
關鍵字lambda表示匿名函式,冒號前面的x表示函式引數。
>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
python對匿名函式的支援有限,只有一些簡單的情況下可以使用匿名函式。
八、裝飾器
在**執行期間動態增加功能的方式,稱之為「裝飾器」(decorator)。
在物件導向(oop)的設計模式中,decorator被稱為裝飾模式。oop的裝飾模式需要通過繼承和組合來實現,而python除了能支援oop的decorator外,直接從語法層次支援decorator。python的decorator可以用函式實現,也可以用類實現。
decorator可以增強函式的功能,定義起來雖然有點複雜,但使用起來非常靈活和方便。
九、偏函式
當函式的引數個數太多,需要簡化時,使用functools.partial可以建立乙個新的函式,這個新函式可以固定住原函式的部分引數,從而在呼叫時更簡單。
py函式式程式設計
函式式程式設計把計算視為函式而非指令,純函式式程式設計不需要變數,沒有 測試簡單,python支援的函式式程式設計不是純函式式程式設計,允許有變數存在,支援高階函式,支援閉包,有限度的支援匿名函式 變數可以指向函式,而函式又可以把變數作為引數,所以高階函式就是把函式作為引數的函式。def add x...
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...
python函式式程式設計模式 什麼是函式式程式設計思維?
函式式程式設計與命令式程式設計最大的不同其實在於 函式式程式設計關心資料的對映,命令式程式設計關心解決問題的步驟 這裡的對映就是數學上 函式 的概念 一種東西和另一種東西之間的對應關係。這也是為什麼 函式式程式設計 叫做 函式 式程式設計。這是什麼意思呢?假如,現在你來到 google 面試,面試官...