python函式式程式設計模式 Python函式式程式設計

2021-10-21 04:44:00 字數 2454 閱讀 9478

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

函式式程式設計的乙個特點就是,允許把函式本身作為引數傳入另乙個函式,還允許返回乙個函式!

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 面試,面試官...