當前位置:
首頁 > 知識 > Python中用函數編程 打開另一個世界的大門

Python中用函數編程 打開另一個世界的大門


原創 2017-05-24 數說君 數說工作室



Python中用函數編程 打開另一個世界的大門



編程界有一位傳奇人物——王垠,介紹一下他的退學經歷,對,你沒聽錯,退!學!經!歷!:


2006年,從清華大學計算機系退學,在水木社區BLOG上發表了《清華夢的粉碎--寫給清華大學的退學申請》一文,此時離博士畢業還差一年;

2008年,從美國康奈爾大學計算機系退學,在網上發表《Cornell 感受》;


2012年,從印第安納大學伯明頓分校計算機系退學,以一篇文章《對博士學位說永別》,徹底告別了學生生涯。


這裡插一句,就在我寫這篇文章的時候(寫的時間有點久...),王垠的博客又更新了一篇文章《微軟的秘密離職協議》,文中描述了他離職微軟的撕逼過程......


更傳奇的是他的「40行代碼」。據說,他層公開過一段40行的代碼,並宣稱這是他上半生最重要的傑作,曾經耗費頂級專家多年的研究,知乎上有專門的討論:



Python中用函數編程 打開另一個世界的大門



從這幾個經歷,我們大概可以推測王垠這個人:


是一位程序大牛;


他追求的 是某種我們凡人無法感受到的東西;


他很能寫,不論是代碼還是段子。

這麼一位程序員大牛+重磅寫手,在網路上寫了幾篇深遠影響的文章:



Python中用函數編程 打開另一個世界的大門



其中有一篇跟本文的要說的內容有關——《面向對象編程和函數式編程的問題出在哪裡》,這篇文章他將面向對象編程,和函數式編程並列,對兩種編程進行了比較和點評。文中的重點,是批評了純函數式編程


文本不討論這篇文章,主要是聊一聊到底什麼是「函數式編程」。


點進來的很多同學,應該和我一樣,都是數據/統計出身,搗鼓比較多的是SAS/ R,後來轉向Python,發現了lambda、map、reduce這些「奇怪」的東西。這說明,你已經開始了函數式編程的體驗。


為了呈現函數式編程的概念,我們將編程思維分成「平凡的世界」和「函數的世界」,從實例對比中了解函數式編程。


另外,由於Python是一種通用性編程語言,它支持函數式編程,因此本文的代碼實例都用Python來舉例。


在「平凡的世界」中,我們一般都是怎麼寫代碼的?以前學SAS的時候看到過一句話:


一門編程語言,只要能實現分支和循環,就能夠完成幾乎所有的運算。

這麼說來,我們在平時編程中無外乎用下面這幾個語句:


分支:if...elif...


循環:for/ while/ do...loops


其他還有賦值、函數定義def等。


而在「函數式編程」的世界中,這些將全部用函數來實現!!比如:


匿名函數lambda、Map函數、Reduce函數。


基本上,這幾個函數就可以實現任意的Python程序了!我們通過實例來認識一下:


匿名函數:lambda表達式


lambda表達式,又叫匿名函數,它用來創建一個函數,取代def這個功能。


比如,定義一個函數,返回兩個參數x+y的值,

在「平凡的世界」里,我們這麼寫:


def add(x, y):


return x + y


print add(1,2)


用lambda表達式,我們可以這麼寫:


add=lambda x,y : x + y


print add(1,2)


因此,lambda表達式的格式提煉如下:


func = lambda 參數: 調用參數的表達式


Map函數

Map函數,是用函數的方式來實現一個循環運算,類似for的功能:


比如,現在有一個list=[2, 4, 6, 7, 8],想對裡面每個元素進行平方,生成一個新的new_list。


在「平凡的世界」里,我們這麼寫:


list = [2, 4, 6, 7, 8]


new_list = [ ]


for i in list:


new_list.append(i*i)


返回的結果是:


[4, 16, 36, 49, 64]


用Map函數,我們這麼寫:

sqr = lambda a: a*a


print map(sqr, [2, 4, 6, 7, 8])


返回的結果、:


[4, 16, 36, 49, 64]


因此,Map函數的使用格式提煉如下:


new_list = Map(func, list),將list中每個元素都進行一個func函數的計算,生成一個新的list


Reduce函數


這個我用的比較少,簡單介紹一下,它是對一個數組的元素,進行從左到右進行一個累計的計算。


比如,有一個list=[2, 4, 6, 7, 8],現在相對所有元素從左到右進行相乘


在「平凡的世界」里,我們這麼寫:

result = 1


for i in [2, 4, 6, 7, 8]:


result = result * i


print result


返回結果為:2688


用reduce函數,我們這麼寫:


conplus = lambda a,b: a*b


print reduce(conplus , [2, 4, 6, 7, 8])


返回結果為2688.


因此,Reduce函數的使用格式提煉如下:

result = Map(func, [a1, a2, a3...]),將list中元素,從左到右進行func計算,先計算func(a1, a2), 在計算func(func(a1, a2), a3).....


這些函數相互搭配使用,據說(我也不敢肯定)能代替任務的Python程序!不管怎樣,我們大概知道了「函數式編程」這個概念:


它用一系列函數取解決問題,代碼簡潔,沒有循環體,也不用生成各種倒來倒去的臨時變數。


但是,回到開篇王垠的批判文章,「函數式編程」有哪些缺點?下次有機會再說。


想要系統學習python和免費學習資料的 可以加裙 四七四五三四九五一

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

Python使用擴展庫progressbar顯示進度條

TAG:Python |

您可能感興趣

老冒:從OCAP到Blocklet,ArcBlock為傳統開發者打開區塊鏈的大門
榮耀Note 10開箱美圖鑑賞,GPU/CPU雙Turbo模式一鍵打開遊戲大門
微軟Outlook iOS版更新:用Edge打開
打開 Capsule Net 的黑箱(一)
Living Room vs Family Room,哪一個才是你家客廳的正確打開
Ethereum開發人員打開EIP,討論「賄賂」Ethash ASIC礦工
打開這一開關,iPhone聲音瞬間變大
Photoshop軟體文件的多種打開方式
上帝給Air Jordan 3關上了4扇窗,卻打開了新世界的大門!
Android 應用內部打開PDF、Excel、Word文檔你們Get了么?
Open the Door of Wisdom 打開智慧之門
嗅覺之門,讓Keira Knightley為你打開
Faker賽後大發牢騷:上中下路都是我打開的,MVP卻是Bang和Wolf!
Uni Marketing將助4A打開新局面?
不打開文件獲取名稱。Excel VBA Application對象GetOpenFilename方法教程
MAC OS的正確打開方式,不要再像用Windows一樣用MAC電腦
Windows 10 RS5快速預覽版推送 強制用Edge打開郵件程序中鏈接
用GPU-Turbo打開榮耀Play的全部實力
Monday Blue?打開Instagram吸狗啊!
小米想用PocoPhone打開市場 這款產品能否超越一加?