首先我們考慮乙個初學程式設計一般會了解的問題,計算n的階乘,乙個學過程式設計的程式猿可以簡單的寫出如下**:
def
fact
(n):
return n == 0
and1
or n * fact(n - 1)
ret = fact(5)
# ret = 120
這次我們的主角函式式程式設計,可以寫出如下**:
fact = (lambda highfunc: highfunc(highfunc))(lambda func: lambda n: n == 0
and1
or n * func(func)(n - 1))
ret = fact(5)
# ret = 120
如果不理解上面的**,先來介紹一下基礎的知識。
python 裡面的匿名函式(lambda),在這裡就不過多描述了,相信學過py的各位看官們應該比較熟悉他。
為了講清楚這一點,我們首先來看乙個例子,計算a的n次冪。我們很容易得到如下**:
def
make_power_fn
(power):
defpower_fn
(base):
return base ** power
return power_fn
p3 = make_power_fn(3)
print(p3(10)) # 1000
我們可以發現可以省略power_fn這個函式的名字,那樣我們就可以得到下面的**:
def
make_power_fn
(power):
return
lambda base: base ** power
更進一步的,我們可以得到如下**:
make_power_fn = lambda power: lambda base: base ** power
理解了上述**,我們現在可以討論一開始提出的問題了,計算n的階乘。
我們首先來實現遞迴,簡單一點說,我們可以吧匿名函式作為引數傳遞下去,沒聽明白,我們來看乙個簡單的例子。
lambda func: func(func) # 這樣就實現了遞迴了哈。
我們現在修改一下原始的計算階乘的函式:
def
fact
(func, n):
return n == 0
and1
or n * func(func, n - 1)
然後我們把函式的定義取消掉。
fact = lambda func, n: n == 0
and1
or n * func(func, n - 1)
print(fact(fact, 5)) # 120
現在看起來已經比較好了,但是還是有func的引數傳遞,我們想要直接呼叫fact(),也就是說我們需要把後面那個函式作為引數傳遞給前面,最終我們便得到了一開始的**。
終於講完了,小白一枚,大佬們看看就好了。
Python中函式式使用
對於鍊錶來講,有三個內建函式非常有用 filter map 以及 reduce filter function,sequence 返回乙個 sequence 序列 包括了給定序列中所有呼叫function item 後返回值為 true 的元素 如果可能的話,會返回相同的型別 如果該 序列 sequ...
Python基礎 如何使用函式
目錄前言 函式定義函式 匿名函式 實參和形參 傳遞實參 位置實參 關鍵字實參 形參預設值 最後 如何使程式的編寫 閱讀 測試和修復變得更簡單呢,對啦,我們可以使用函式,接下來我們將學習有關函式的知識。我們可以定義屬於自己的函式,語法格式為 def 函式名 引數列表 函式體定義函式的規則如下 任何傳入...
python 函式式 panda 函式式
摘要 一提到程式設計正規化,很容易聯想到宗教的虔誠,每種宗教所表達信條都有一定合理性,但如果一直只遵循一種教條,可能也被讓自己痛苦不堪,程式設計正規化也是如此。案例1 案例一,摘抄來自一企業培訓材料,主要 邏輯是列印每課成績,並找出學生非f級別課程統計平均分數 class coursegrade 摘...