Python進階之路:偏函數functools.partial的應用

偏函數(Partial function)是通過將一個函數的部分參數預先綁定為某些值,從而得到一個新的具有較少可變參數的函數。在Python中,可以通過functools中的partial高階函數來實現偏函數功能。

Python進階之路:偏函數functools.partial的應用

目前,在網上可以找到很多關於functools.partial用法的文章和例子。比如下面這個:

這個例子比較好地展示了functools.partial的用法,但是並沒有講清楚偏函數究竟應該用在什麼樣的場景中,總給人一種屠龍之術,華而不實的感覺。

今天,小編就帶大家通過幾個實用的例子,來分析一下,善用functools.partial將會給我們的代碼帶來怎樣的變化。

實例1:用functools.partial生成自己的專屬函數

我們在編碼時經常會遇到這樣的場景,即根據一個字符串的內容而採取不同的處理邏輯,就像下面這樣:

Python進階之路:偏函數functools.partial的應用

初看之下,這種寫法也許還過得去。但是時間一長,你可能就忘了這些正則表達式究竟是幹什麼的了。於是,我們做了下面的重構:

Python進階之路:偏函數functools.partial的應用

這樣看起來感覺好多了。事實上,如果只有這三個函數的話,我是可以接受目前的寫法的。但是,如果你的代碼中有幾十個類似的用於判斷字符串模式的函數,那麼就需要在一個地方把它們統一管理起來,於是就有了下面的寫法:

Python進階之路:偏函數functools.partial的應用

在這段代碼中,我們通過functools.partial將re.search函數與不同的正則表達式綁定,從而得到了一系列供我們使用的專屬函數。通過這種方法,不但使得代碼更加簡練,而且提高了可讀性。

實例2:用partial生成具有繼承關係的輔助對象

假設我們現在要寫一段處理ajax請求的代碼,重構前的代碼是長這個樣子的:

Python進階之路:偏函數functools.partial的應用

這段代碼主要有以下幾個問題:

每次構造HttpResponse對象時,都需要傳入"application/json"作為參數

每次都需要調用json.dumps()

重複出現的狀態碼

以上問題使得這段代碼看起來不夠精煉,佔用了較大篇幅但實際上沒有做太多事情。

所以,我們重構的第一步是要抽象出一個JsonResponse對象來承載返回值:

Python進階之路:偏函數functools.partial的應用

經過第一步重構後的代碼如下:

Python進階之路:偏函數functools.partial的應用

所有返回HttpResponse 的地方都被我們新引入的JsonResponse所替代。

接下來,通過functools.partial,我們可以對Response做進一步的抽象,生成一系列JsonResponse的“子類”:

Python進階之路:偏函數functools.partial的應用

最終,重構後的代碼如下:

Python進階之路:偏函數functools.partial的應用

這樣,我們最大限度地減少了冗餘代碼,使代碼精煉易讀。

我們再來看最後一個例子,看看partial是如何讓代碼變得簡練的。

實例3:Django emails

Python進階之路:偏函數functools.partial的應用

看了今天的例子,大家是不是覺得Python提供的partial工具非常的好用呢?不如趕快打開電腦試一下吧。

感謝大家閱讀我的文章,歡迎留言討論。


分享到:


相關文章: