函式式程式設計

2021-10-01 13:10:22 字數 2838 閱讀 4029

第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() #呼叫返回函式

69python中閉包

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 而且 演算的函式可以接受函式當...