第2章 函式式程式設計
一、python中函式式程式設計簡介
1、函式!= 函式式 就如 計算!=計算機
2、函式式程式設計的特點:
(1)、把計算視為函式而非指令
(2)、純函式式程式設計:不需要指令,沒有***,測試簡單
(3)、支援高階函式,**簡潔
3、python支援的函式式程式設計
(1)不是純函式式程式設計:允許有變數
(2)支援高階函式:函式也可作為引數傳入
(3)支援閉包,有了閉包就能返回函式
(4)有限度地支援匿名函式
二、python中高階函式
1、變數可以指向函式
>>> abs(-10)
10>>>f = abs 定義乙個變數指向函式abs
>>>f(-20) 利用變數呼叫函式abs
202、函式名就是指向函式的變數
>>>abs = len
>>>abs(-10)
此時會報錯,因為abs已經指向了len函式,不再是求絕對值的函式名了
>>>abs([1, 2, 3])
33、高階函式:只能接受函式作為引數的函式
函式能接受變數作為引數,變數能指向函式,所以能接受函式作為引數的函式成為高階函式。
demo:
>>>def add(x, y, f):
... return f(x)+f(y)
...>>>add(-1, 2, abs)
34、
import math #注意點,匯入數學檔案
def add(x,y, f):
return f(x) + f(y)
print add(25, 9, math.sqrt) #注意使用數學函式的方式
5、python中的reduce()函式
reduce()函式是python函式的內建函式,需要接受兩個引數,f函式和list。但是f函式需要有兩個引數,且對list的元素進行反覆呼叫函式f
demo:
def f(x, y):
return x+y
reduce(f, [1, 2, 3, 4, 5])計算過程:
f(1, 2) 返回3
f(3, 3) 返回6
f(6, 4) 返回10
f(10, 5) 返回15 即求的list的和
reduce函式也可以有第3個可選引數,比如reduce(f, [1,2,3,4,5], 100) 那麼將100設為加法的開始項進行求和。
6、python中的filter()函式
filter函式接受兩個引數,乙個f函式,乙個list,f函式對list中的每個元素按設定的條件進行判斷,返回false or true,filter函式會根據判斷結果自動過濾掉不符合條件的元素,返回乙個新的list,該list的元素都是符合條件的。
7、python中自定義排序函式
python中內建排序函式sorted()可對list進行排序
>>>sorted([4, 3, 5, 1]) #list有序的意思:建立的元素順序與輸出的順序一樣,但list內的元素大小順序是需要演算法另外操作排序的。
[1, 3, 4, 5]
但sorted()也是乙個高階函式, 可以接受乙個比較函式來實現自定義排序。
比較函式有兩個引數x、y,如果x排在y前面,返回-1,若x排在y後面,返回1,若相同,返回0.
>>> sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]
8、python中返回函式
def calc_sum(lst):
#定義函式lazy_sum
def lazy_sum():
return sum(lst) #巢狀函式裡使用到了lst,但是不用將lst作為lazy_sum的引數,直接使用就行
return lazy_sum
注意區分返回的是函式還是返回值
def myabs():
return abs # 返回函式
def myabs2(x):
return abs(x) # 返回函式呼叫的結果,返回值是乙個數值
>>>d = calc_sum([1,2,3])
此時d為指向函式lazy_sum的變數
>>>d() #呼叫返回函式
69、python中閉包
demo:
def calc_sum(lst):
def lazy_sum():
return sum(lst)
return lazy_sum
內層函式引用了外層函式的變數(外層函式的引數也是變數),且返回內層函式的函式,稱之為閉包函式。
f1, f2, f3 = count() #是三個賦值語句的縮寫
print f1(), f2(), f3() #因為list fs裡儲存的是函式變數,所以輸出時要輸出函式。
f1,f2,f3函式都指向同乙個函式f,所以當呼叫f1時,f函式的內容已經變了,導致f2,f3所指向的內容也發生了變化,所以三個函式列印出來的結果都為9.
即也符合當外層函式返回內層函式後,內層函式裡的引用變數後來又發生了變化,導致閉包函式使用錯誤。
f1, f2, f3 = count()
print f1(), f2(), f3()
函式式程式語言python 函式式程式設計
函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...
函式式程式設計
最近在看一些關於js方面的東東,除了些ajax的基本應用,還了解了些函式式程式設計 fp 的東東。雖然以前也玩過幾天lisp的,不過因為當時完全對fp的東西沒有概念,壓根就不知道原來這是list那一族最大的特性之一 另外我知道的還有個是gc,orz.光注意那些詭異的 表 去了。總結一下,傳統上認為f...
函式式程式設計
維基百科 函式式程式設計 英語 functional programming 或者函式程式設計,又稱泛函程式設計,是一種程式設計范型,它將計算機運算視為數學上的函式計算,並且避免使用程式狀態以及易變物件。函式程式語言最重要的基礎是 演算 lambda calculus 而且 演算的函式可以接受函式當...