1.1.什么是函數式編程?
函數式編程使用一系列的函數解決問題。函數僅接受輸入并產生輸出,不包含任何能影響產生輸出的內部狀態。任何情況下,使用相同的參數調用函數始終能產生同樣的結果。
在一個函數式的程序中,輸入的數據“流過”一系列的函數,每一個函數根據它的輸入產生輸出。函數式風格避免編寫有“邊界效應”(sideeffects)的函數:修改內部狀態,或者是其他無法反應在輸出上的變化。完全沒有邊界效應的函數被稱為“純函數式的”(purelyfunctional)。避免邊界效應意味著不使用在程序運行時可變的數據結構,輸出只依賴于輸入。
可以認為函數式編程剛好站在了面向對象編程的對立面。對象通常包含內部狀態(字段),和許多能修改這些狀態的函數,程序則由不斷修改狀態構成;函數式編程則極力避免狀態改動,并通過在函數間傳遞數據流進行工作。但這并不是說無法同時使用函數式編程和面向對象編程,事實上,復雜的系統一般會采用面向對象技術建模,但混合使用函數式風格還能讓你額外享受函數式風格的優點。
1.2.為什么使用函數式編程?
函數式的風格通常被認為有如下優點:
邏輯可證
這是一個學術上的優點:沒有邊界效應使得更容易從邏輯上證明程序是正確的(而不是通過測試)。
模塊化
函數式編程推崇簡單原則,一個函數只做一件事情,將大的功能拆分成盡可能小的模塊。小的函數更易于閱讀和檢查錯誤。
組件化
小的函數更容易加以組合形成新的功能。
易于調試
細化的、定義清晰的函數使得調試更加簡單。當程序不正常運行時,每一個函數都是檢查數據是否正確的接口,能更快速地排除沒有問題的代碼,定位到出現問題的地方。
易于測試
不依賴于系統狀態的函數無須在測試前構造測試樁,使得編寫單元測試更加容易。
更高的生產率
函數式編程產生的代碼比其他技術更少(往往是其他技術的一半左右),并且更容易閱讀和維護。
1.3.如何辨認函數式風格?
支持函數式編程的語言通常具有如下特征,大量使用這些特征的代碼即可被認為是函數式的:
函數是一等公民
函數能作為參數傳遞,或者是作為返回值返回。這個特性使得模板方法模式非常易于編寫,這也促使了這個模式被更頻繁地使用。
以一個簡單的集合排序為例,假設lst是一個數集,并擁有一個排序方法sort需要將如何確定順序作為參數。
如果函數不能作為參數,那么lst的sort方法只能接受普通對象作為參數。這樣一來我們需要首先定義一個接口,然后定義一個實現該接口的類,最后將該類的一個實例傳給sort方法,由sort調用這個實例的compare方法
以上內容為大家介紹了Python函數式編程概述,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。