Python中用函數編程 打開另一個世界的大門
原創 2017-05-24 數說君 數說工作室
編程界有一位傳奇人物——王垠,介紹一下他的退學經歷,對,你沒聽錯,退!學!經!歷!:
2006年,從清華大學計算機系退學,在水木社區BLOG上發表了《清華夢的粉碎--寫給清華大學的退學申請》一文,此時離博士畢業還差一年;
2008年,從美國康奈爾大學計算機系退學,在網上發表《Cornell 感受》;
2012年,從印第安納大學伯明頓分校計算機系退學,以一篇文章《對博士學位說永別》,徹底告別了學生生涯。
這裡插一句,就在我寫這篇文章的時候(寫的時間有點久...),王垠的博客又更新了一篇文章《微軟的秘密離職協議》,文中描述了他離職微軟的撕逼過程......
更傳奇的是他的「40行代碼」。據說,他層公開過一段40行的代碼,並宣稱這是他上半生最重要的傑作,曾經耗費頂級專家多年的研究,知乎上有專門的討論:
從這幾個經歷,我們大概可以推測王垠這個人:
是一位程序大牛;
他追求的 是某種我們凡人無法感受到的東西;
他很能寫,不論是代碼還是段子。
這麼一位程序員大牛+重磅寫手,在網路上寫了幾篇深遠影響的文章:
其中有一篇跟本文的要說的內容有關——《面向對象編程和函數式編程的問題出在哪裡》,這篇文章他將面向對象編程,和函數式編程並列,對兩種編程進行了比較和點評。文中的重點,是批評了純函數式編程。
文本不討論這篇文章,主要是聊一聊到底什麼是「函數式編程」。
點進來的很多同學,應該和我一樣,都是數據/統計出身,搗鼓比較多的是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和免費學習資料的 可以加裙 四七四五三四九五一
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打開市場 這款產品能否超越一加?