人生苦短,我用 Python
很久沒有挖一個坑轉(zhuǎn)身離去之后,坑邊的群眾久久駐足不愿離去,不停的沖著黑漆漆的坑底喊話「啥時回來啊~~」。行走江湖,講究一個信字。Python 這一篇,來了。
我和Python
我接觸 Python 并不算早,***次使用 Python 寫生產(chǎn)系統(tǒng)的程序是2004年,那時候我已經(jīng)有了幾年的編程經(jīng)驗。當(dāng)然了,現(xiàn)在這年頭說早晚都不合適,昨天我說2000年就開始使用 Vim 編程了,有小伙伴回復(fù),那年我才12,這……多少有點(diǎn)尷尬。
早期用 Python 主要寫一些服務(wù)器端的工具,后來也寫后端服務(wù),再后來還寫過內(nèi)容抓取、數(shù)據(jù)分析和 Alfred 的插件等一系列雜七雜八的東西,簡單的工具用 Shell 寫,復(fù)雜的和龐大的用 C 或 Java 實現(xiàn),中間的三不管地帶,用 Python 就好,每次都不會讓你失望。2005到2006年那段時間我參加了一個類似 Corba 的分布式應(yīng)用系統(tǒng)的開發(fā),與國外的程序員合作,寫了大量的 Python 代碼。
Python 有什么好處?功能強(qiáng)大,使用簡單,語言唯一性的特征明顯(唯一性的意思就是你不能用十八種寫法實現(xiàn)一個功能),而且具備海量的第三方庫……Python 程序員***說的一句話是:人生苦短,我用 Python(也是 Python 之父的名言)。這句話與「PHP 是世界上***的編程語言」一樣并世***,可謂「倚天不出,誰與爭鋒」。
Python 支持交互式編程、面向?qū)ο缶幊?、函?shù)式編程、面向切面編程、當(dāng)然還有元編程。目前這門編程語言在兵器譜的排名是第四,前三位分別是Java、C 和C++。江湖上人稱四哥的,就是 Python。
Python 起源
Python 之父是 Guido van Rossum,荷蘭人。每個編程語言的作者都是一個技術(shù)傳奇,Guido 也不例外。他1982年從阿姆斯特丹大學(xué)畢業(yè),獲得了數(shù)學(xué)和計算機(jī)兩個碩士學(xué)位,***做的事情就是編寫代碼。那個時代,流行的語言是匯編、C、Fortran 等,這些語言要求編程者對計算機(jī)的運(yùn)行機(jī)制有精確的了解,以充分利用硬件資源達(dá)成自己的目標(biāo),因為硬件資源實在是太匱乏和寶貴了,程序員們需要榨干計算機(jī)硬件的每一滴血和汗才能完成任務(wù)。
這給 Guido 帶來很多困惑,用 C 實現(xiàn)個功能吧,完成度沒有問題,但是需要耗費(fèi)大量時間。用 Shell 吧,面對復(fù)雜問題又束手無策。Shell 是 Unix/Linux 下的腳本語言,也叫膠水語言,它可以把系統(tǒng)的各種功能通過管道(比如:find . -name “*.java” | xargs grep chjq)的方式連接起來實現(xiàn)系統(tǒng)運(yùn)維、定時任務(wù)、文件處理、程序安裝卸載等工作,但是處理復(fù)雜的數(shù)值運(yùn)算或系統(tǒng)調(diào)用就很麻煩。這時候需求就來了,Guido 希望一門語言既能像 C 語言一樣能夠全面掌控計算機(jī)的資源,也能像 Shell 一樣使用簡單,還具備交互性編程能力,輕輕松松編寫一些小的工具包。
普通人 —— 比如我 —— 有了這種需求就會對自己說,再等等,也許隔壁馮老師會做出來呢。馮老師的想法就更簡樸了,我又不寫代碼,關(guān)我什么事。幸好 Guido 沒這么想,Guido 對自己說的是,放著我來!
1989年的冬天,Guido 為了度過一個有意義的圣誕節(jié),或者為了打發(fā)一個無聊的假期,開始編寫 Python 語言的編譯器和解釋器,靈感來自教學(xué)語言 ABC(你不知道還有這種語言吧)。為什么叫 Python?因為 Guido 很喜歡 BBC 電視劇 —— 蒙提·派森的飛行馬戲團(tuán)(Monty Python’s Flying Circus)。ABC 則是由 Guido 參加設(shè)計的一種教學(xué)語言。Guido 一直認(rèn)為 ABC 這種語言非常優(yōu)美和強(qiáng)大,是專門為非「專業(yè)程序員」設(shè)計的。但是 ABC 語言并沒有成功,究其原因,Guido 認(rèn)為是非開放造成的。Guido 決心在 Python 中避免這一錯誤,這一次他成功了。
1991年,***個 Python 版本誕生,編譯器是 C 語言實現(xiàn)的,Python 語言可以非常方便的調(diào)用 C 語言實現(xiàn)的庫(這一點(diǎn)太重要了)。從一問世,Python 就是一個動態(tài)語言,面向?qū)ο缶幊痰恼Z言,具備類、函數(shù)、異常處理、列表(list)、詞典(dict)、元組等數(shù)據(jù)類型。
Python 的語法同時受到了 C 和 ABC 語言的影響,比如采用 def 來定義函數(shù),比如等號賦值,比如強(qiáng)制縮進(jìn)。如果你是個 C 或 Java 程序員,習(xí)慣了用大括號來劃分程序域 —— 其實大部分語言都是這么做的 —— 看到 Python 是用縮進(jìn)來搞定這件事,你馬上會覺得「Holy shit」,其實這種做法來自 ABC,Guido 的想法是,如果「常識」上確立的東西,沒有必要過度糾結(jié)。當(dāng)然,這種常識是 Guido 的常識,至于其他人,你們會習(xí)慣的。
事實也是如此, Python 吸引了大量的程序員,他們開始協(xié)同改進(jìn)這門語言,Python 開始了改變世界的征程。
2000年10月16日 Python 2.0 發(fā)布,這次增加了實現(xiàn)完整的垃圾回收,并且支持 Unicode 編碼。Guido 在開發(fā)的過程中一直遵循了開放的原則,社區(qū)協(xié)作的模式從最初的郵件列表改為開源的方式,Python 吸收了大量開發(fā)者和編程語言的特點(diǎn),比如,Python 中的正則表達(dá)參考了 Perl,而內(nèi)置函數(shù) lambda,map,reduce,filter 等則參考了 Lisp,無數(shù)優(yōu)秀的程序員為 Python 添磚加瓦,Python 搞不定的,沒關(guān)系,我們用 C 實現(xiàn),于是 Python 有了大量的函數(shù)庫,尤其在數(shù)據(jù)分析和科學(xué)計算領(lǐng)域。另外,函數(shù)在 Python 中是一等公民,所以 Python 同時也是一種函數(shù)式編程語言。
Python 穩(wěn)步發(fā)展,成為了一代老牌編程語言。
Python 的應(yīng)用
每個編程語言都有自己的 Hello World,Python 最為簡單。如果你有臺 Mac 電腦,Python 的 SDK 是默認(rèn)安裝的。打開終端,輸入 python 進(jìn)入 python shell 的交互界面,然后鍵入
>>> print “Hello World”
程序?qū)懲炅?。Python 這么簡單,是不是一門玩具語言呢?當(dāng)然不是。NASA 的火箭發(fā)射儀表盤系統(tǒng)使用了 Python 的 Tkinter —— 支持實時響應(yīng)的 GUI 庫。NASA 的太陽物理學(xué)分詞庫 SunPy 也是基于 Python 寫的。YouTube 基于開發(fā)速度的考慮,大部分代碼是 Python 實現(xiàn)的,YouTube 的流量有多大,老百姓不知道,程序員應(yīng)該知道。Google、Dropbox 更是大量采用 Python 語言(Guido 工作過的兩個地方)。國內(nèi)的豆瓣、知乎也是 Python 的重度使用者。
雖然 Python 已經(jīng)被廣泛使用了,但前幾年它在兵器譜上總是排 8-12 的位置。最近兩年事情開始發(fā)生變化,去年 Python 開始迅速攀升至第五名,今年更進(jìn)一步,排名第四。為什么會發(fā)生這種變化呢?并不是 Python 增加了什么了不得的特性,而是人工智能和機(jī)器學(xué)習(xí)的時代來臨了。
AI 時代的 Python
我來做一個不負(fù)責(zé)任的判斷,Python 將成為大數(shù)據(jù)、AI 和機(jī)器學(xué)習(xí)時代的***編程語言??梢韵胂筮@樣一個場景,Python 和 Java、Go、C、C#、Ruby、PHP……坐在圓桌前開會,Python 抱著頭后仰在 Herman Miller 工程椅上,慵懶的對其他編程語言說:
對不起,我不是針對你,我是說,所有在座的各位,都只能掙第二。
當(dāng)然了,這個語言范疇是限定在大數(shù)據(jù)、AI 和機(jī)器學(xué)習(xí)領(lǐng)域。但是,如果這個領(lǐng)域在未來的應(yīng)用足夠廣泛,那 Python 直接滅掉 Java 當(dāng)大哥也不是不可能的。
Python 性能這么差,對多核并發(fā)編程支持的也不好,并且長期分裂成了 Python 2 和 Python 3 兩個陣營,給開發(fā)者帶來了諸多不便和麻煩,為什么能后來者居上呢?
因為 Python 遵循了現(xiàn)代的木桶原理。
Python 的木桶原理
我在自己的小密圈(目前已經(jīng)漲價到128元,因為貴即是好)提了一個問題:為什么很多數(shù)據(jù)分析和機(jī)器學(xué)習(xí)的框架都會選用 Python 做主要的開發(fā)或***支持的語言呢?
一位女程序員穎兒的回答最靠譜:免費(fèi),簡潔,生態(tài)好,庫豐富,操心少;之前刷機(jī)器學(xué)習(xí)的題,用 C# 寫了一坨兒。結(jié)果人家引個 SciPy 庫,三行代碼搞定。
SciPy 是一個數(shù)值計算庫,NumPy 是 Python 另一個開源的數(shù)值計算擴(kuò)展庫,Pandas 是基于 NumPy 的數(shù)據(jù)分析工具,matplotlib 是圖形繪制庫,最近火熱的 Scikit-learn 則是開源的機(jī)器學(xué)習(xí)框架。這些庫對于 Python 來說就三個字:「隨便用」。長此以往,圍繞 Python 語言構(gòu)建出來的生態(tài)庫讓其他語言望塵莫及,尤其是在科學(xué)計算、數(shù)據(jù)分析和機(jī)器學(xué)習(xí)領(lǐng)域。
以前我們說「木桶原理」是講一只水桶能裝多少水取決于它最短的那塊木板,所以我們應(yīng)該去思考和補(bǔ)齊自己的短板,才能成事。到了現(xiàn)代,知識爆炸信息擁堵,沒人有時間去補(bǔ)齊短板,能夠讓自己的長板足夠長就不錯了。短板怎么辦,找別人來補(bǔ)齊啊。能協(xié)作的組織和人才是最有生命力的。
Python 也是一樣。自誕生以來,一直保持了簡單、開放、語言工業(yè)化,具備良好的封裝、組合、嵌入能力,開發(fā)效率驚人。Python 把這些方面做到***,其他的事情,留給別人去干嘛。
你們不是覺得 Python 慢么,自然有人給開發(fā)出 PyPy、Cython、Jython、Numba 這樣的編譯器工具來提高 Python 的效率。要進(jìn)行科學(xué)計算、大數(shù)據(jù)分析,好了,SciPy、Pandas 誕生了,要機(jī)器學(xué)習(xí),scikit-learn、Theano、Pylearn2 等機(jī)器學(xué)習(xí)庫開發(fā)出來了。Python 調(diào)用這些用 C 或者 Fortran 開發(fā)出來的庫比原生語言調(diào)用還方便,你說大家能不用 Python 么?
每當(dāng)新事物來臨的時候,總有很多專家里手對新手們豎起一道高墻,比如機(jī)器學(xué)習(xí)總被放到學(xué)術(shù)研究和 CS 科班出身這堵墻的后面,讓人望而生畏。其實,機(jī)器學(xué)習(xí)這個領(lǐng)域,同樣是個金字塔,這些專家和博士以及人工智能算法的創(chuàng)造者們,屬于塔尖的極少數(shù)人,他們發(fā)現(xiàn)原理,實現(xiàn)算法,***潮流,突破極限,然后呢?基于這些算法和原理開發(fā)應(yīng)用和使用應(yīng)用的,是廣大的程序員和人民群眾,他們可能沒有那么高深的數(shù)學(xué)知識,不知道 Regression 和 Decision Tree 算法,不了解散步矩陣……那我們可以用 Python 調(diào)包啊,只要那些包足夠成熟就好了。
也許未來每個人與機(jī)器溝通的每一句話,就是喚起了一段 Python 代碼呢?
Python 的分裂
Python 2 和 Python 3 已經(jīng)長期共存了數(shù)年之久,原因很復(fù)雜,對于這個話題,足夠?qū)懥硪黄恼铝恕D壳肮俜奖硎緦?2 的支持到2020年,但 2 的生態(tài)庫遠(yuǎn)遠(yuǎn)大于 3,這就讓人很糾結(jié)。