python函式式程式設計模式 什麼是函式式程式設計思維?

2021-10-11 05:40:04 字數 1683 閱讀 7413

函式式程式設計與命令式程式設計最大的不同其實在於:

函式式程式設計關心資料的對映,命令式程式設計關心解決問題的步驟

這裡的對映就是數學上「函式」的概念——一種東西和另一種東西之間的對應關係。

這也是為什麼「函式式程式設計」叫做「函式」式程式設計。

這是什麼意思呢?

假如,現在你來到 google 面試,面試官讓你把二叉樹映象反轉一下(大霧

幾乎不假思索的,就可以寫出這樣的 python **:

def inverttree(root):

if root is none:

return none

root.left, root.right = inverttree(root.right), inverttree(root.left)

return root

好了,現在停下來看看這段**究竟代表著什麼——

它的含義是:首先判斷節點是否為空;然後翻轉左樹;然後翻轉右樹;最後左右互換。

這就是命令式程式設計——你要做什麼事情,你得把達到目的的步驟詳細的描述出來,然後交給機器去執行。

這也正是命令式程式設計的理論模型——圖靈機的特點。一條寫滿資料的紙帶,一條根據紙帶內容運動的機器,機器每動一步都需要紙帶上寫著如何達到。

那麼,不用這種方式,如何翻轉二叉樹呢?

函式式思維提供了另一種思維的途徑——

所謂「翻轉二叉樹」,可以看做是要得到一顆和原來二叉樹對稱的新二叉樹。

這顆新二叉樹的特點是每乙個節點都遞迴地和原樹相反。

用 haskell **表達出來就是:

data tree a = nil | node a (tree a) (tree a)

deriving (show, eq)

invert :: tree a -> tree a

invert nil = nil

invert (node v l r) = node v (invert r) (invert l)

(防止看不懂,翻譯成等價的 python )

def invert(node):

if node is none:

return none

else

return tree(node.value, invert(node.right), invert(node.left))

這段**體現的思維,就是舊樹到新樹的對映——對一顆二叉樹而言,它的映象樹就是左右節點遞迴映象的樹。

這段**最終達到的目的同樣是翻轉二叉樹,但是它得到結果的方式和 python **有著本質的差別:通過描述乙個 舊樹->新樹 的對映,而不是描述「從舊樹得到新樹應該怎樣做」來達到目的。

那麼這樣有什麼好處呢?

首先,最直觀的角度來說,函式式風格的**可以寫得很精簡,大大減少了鍵盤的損耗(

其次,函式式的**是「對對映的描述」,它不僅可以描述二叉樹這樣的資料結構之間的對應關係,任何能在計算機中體現的東西之間的對應關係都可以描述——比如函式和函式之間的對映(比如 functor);比如外部操作到 gui 之間的對映(就是現在前端熱炒的所謂 frp)。它的抽象程度可以很高,這就意味著函式式的**可以更方便的復用。

另外還有其他答主提到的,可以方便的並行。

同時,將**寫成這種樣子可以方便用數學的方法進行研究(不能理解 monad 就是自函子範疇上的乙個么半群你還想用 haskell 寫出 hello world ?)

至於什麼科里化、什麼資料不可變,都只是外延體現而已。

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函式式程式設計模式 Python函式式程式設計

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

函式式程式語言python 函式式程式設計

函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...