Python之 函式式程式設計

2021-08-14 06:45:22 字數 1836 閱讀 2050

f = lambda x : x + 2       #定義函式f(x) = x + 2

g = lambda x, y : x + y #定義函式g(x, y) = x + y

假設有乙個列表a = [1,2,3], 要給列表中的每個元素都加2得到乙個新列表,利用列表解析,我們可以這樣寫:

b = [i + 2 for i in a]
利用map函式我們可以這樣寫:

b = map(lambda x : x + 2, a)

b = list(b) #結果是[3, 4, 5]

注意:在3.x需要b=list(b)這一步,在2.x不需要這一步,原因是在3.x中,map函式僅僅是建立乙個帶執行的命令容器,只有其他函式呼叫它的時候才返回結果。

也就是說,我們首先定義乙個函式,然後利用map命令將函式逐一應用到(map)列表中的每個元素,最後返回乙個陣列。map()命令也接受多引數的函式,如

map(lambda x,y : x * y, a, b)

表示將a、b兩個列表的元素對應相乘,把結果返回給新列表。

有了列表解析,為什麼還要有map函式呢?雖然列表解析**簡單,但是本質上還是for迴圈,而python的for命令執行效率並不高,map函式實現了相同的功能,並且效率更高,原則上來講,它的迴圈命令相當於c語言。

reduce()函式有點像map()函式,但map()函式用於逐一遍歷,而reduce()函式用於遞迴計算。比如:計算n的階乘:

reduce(lambda x,y: x*y, range(1, n+1))
注意:在2.x中,上述命令可以直接執行,在3.x中,reduce函式已經被移出了全域性命名空間,它被置於fuctools庫中,如需使用,則要通過from fuctools import reduce引入reduce

其中,range(1, n+1)相當於給出了乙個列表,元素是1~n這n個整數。lambda x,y : x * y 構造了乙個二元函式,返回兩個引數的乘積。reduce命令首先將列表的前兩個元素作為函式的引數進行運算,然後將運算的結果與第三個數字作為函式的引數,然後再將運算結果與第四個數字作為函式的引數....依次類推,知道列表結束,返回最終的結果。

如果用迴圈命令,那就要寫成:

s = 1

for i in range(1, n+1):

s = s * i

filter是乙個過濾器,用來篩選出列表中符合條件的元素,比如:

b = filter(lambda x : x > 5 and x < 8, range(10))

b = list(b) #結果是[6, 7]

在3.x需要b = list(b) 這一步,在2.x不需要這一步,理由同map

使用filter()函式首先需要乙個返回值為bool型的函式,如上述的lambda x:x > 5 and x < 8 定義了乙個函式,判斷x是否大於5並且小於8,然後將這個函式作用到range(10)的每乙個元素中,如果為true,則「挑出」那個元素,最後將滿足條件的所有元素組成乙個列表返回。

當然,上述filter語句,可以用列表解析寫為:

b = [i for i in range(10) if i > 5 and  i < 8]
它並不比filter語句複雜。但是要注意,我們使用map()、reduce()、或filter(),最終的目的是兼顧簡潔和效率,因為map()、reduce()或filter()的迴圈速度比python內建的for或while迴圈要快得多。

Python之函式式程式設計

1 map map 函式接收兩個引數,乙個是函式,乙個是iterable,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的iterator返回。def f x return x x r map f,1,2,3,4,5,6,7,8,9 print list r 1,4,9,16,25,36...

python高階之函式式程式設計

函式式程式設計不是函式程式設計。函式 function 編寫函式以及呼叫函式 函式式 fuctional 是一種程式設計正規化,是抽象於計算的程式設計模式 函式式程式設計的特點 1.把計算視為函式而非指令 2.純函式式程式設計 不需要變數,測試簡單,還沒有 3.支援高階函式,簡介 而python 支...

Python學習之 函式式程式設計

1 函式式程式設計 1.1 匿名函式 關鍵字lambda表示匿名函式,冒號前面的 x 表示引數。冒號後面只能有乙個表示式,不寫return,返回值就是該表示式的結果。可以不必定義函式名,直接建立乙個函式物件。返回函式的時候,也可以返回匿名函式。下面的 是乙個例子 myabs lambda x x i...