標籤:
函數式編程
最近對Python的學習有些怠慢,最近的學習態度和學習效率確實很不好,目前這種病況正在好轉。
今天,我把之前學過的Python中函數式編程簡單總結一下,分享給大家,也歡迎並感謝大家提出意見。
首先,我們學習函數式編程時,需要知道一個概念:高階函數。那麼到底什麼是高階函數呢?把函數作為參數傳入,這樣的函數就稱為高階函數。而函數式編程就是指這種高度抽象的編程範式。
本文
接下來,我簡單介紹以下四種函數的用法:map/reduce filter sorted lambda
在這裡,map/reduce並不是分布式系統中的map/reduce,而是Python中內建的map()函數和reduce()函數。
map:我們在使用map函數時候,map函數需要接收兩個參數,第一個參數是函數,第二個參數是序列,那麼表示的含義就是map將傳入的函數依次作用在序列中的每一個元素,並把結果以列表的形式返回。
1 def f(x):2 return x*x3 4 print map(f,[1,2,3,4,5,6,7,8,9,10])
結果可想而知了:
看到這裡,你會不會有不屑意味,我幹嘛非得用map函數啊,直接寫一個函數,然後調用即可了啊。不錯,這樣寫肯定沒錯滴,但是會不會有些麻煩呀。看下面的代碼
1 def fuc(x):2 return x*x 3 4 L = []5 for num in [1,2,3,4,5,6,7,8,9,10]:6 L.append(fuc(num))7 print L
reduce:reduce函數和map函數有什麼不同之處呢?reduce函數也需要兩個參數:函數和序列。reduce參數中的函數必須接收兩個參數,那麼reduce函數表示的含義則為把返回的結果繼續和序列的下一個元素做累積計算,典型例子比如對序列求和。
1 def f2(x,y):2 return x+y 3 4 print reduce(f2,[1,2,3,4,5,6,7,8,9,10])
想到reduce的定義,我們還可以用reduce來解決一個蛋疼無比的問題,那就是把序列變為整數,比如[1,2,3,4,5]變為12345。
1 def fn(x,y):2 return x*10+y 3 4 print reduce(fn,[1,2,3,4,5,6,7,8])
filter:filter函數用於過濾序列中某些元素。和map、reduce函數一樣,filter也接收一個函數和一個序列,不同的是,filter把傳入的函數參數作用於序列中每一個元素,然後根據傳回值判斷是true還是false來決定該元素是否被丟棄。
1 def isEven(x):2 return x%2==03 4 print filter(isEven,[1,2,3,4,5,6,7,8,9,10])
sorted:sorted函數用於對序列排序,這個函數之前的Python總結裡多次提到,這裡我簡單說一下通常的規定吧:對於兩個元素x和y,如果x<y,返回-1,如果x>y ,返回1,如果x==y,返回0。這樣預設的規定下,我們排序的結果是從小到大排序的,所以如果想得到從大到小的結果,我們需要重寫sorted函數的規定,這個和C++是一樣的道理吧,就不貼代碼了,自己邊擼邊悟吧。
lambda:便利強大的lambda函數又稱為匿名函數,它不需要顯式的定義函數,但是匿名函數也有一些限制,就是只能有一個運算式,不用寫return,傳回值就是該運算式的結果。
1 print map(lambda x : x*x , [1,2,3,4,5,6,7,8,9,10])2 ff = lambda x : x*x*x 3 print ff(5)
匿名函數也是有很多優點的,要不然怎麼會使用它呢。第一,函數沒有名字,不必擔心有函數名衝突;第二,匿名函數是一個函數對象,也可以把匿名函數賦值給一個變數,然後利用變數來調用函數。
Python學習總結之五 -- 入門函數式編程