人生苦短,我用 Python
我和 Python
我接觸 Python 并不算早,第一次運用 Python 寫消費系統(tǒng)的程序是2004年,那時分我曾經(jīng)有了幾年的編程經(jīng)歷。當(dāng)然了,如今這年頭說早晚都不適宜,昨天我說2000年就開端運用 Vim 編程了,有小同伴回復(fù),那年我才12,這……幾有點為難。
早期用 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 有什么好處?功能強大,使用簡單,語言唯一性的特征明顯(唯一性的意思就是你不能用十八種寫法實現(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é)和計算機兩個碩士學(xué)位,最愛做的事情就是編寫代碼。那個時代,流行的語言是匯編、C、Fortran 等,這些語言要求編程者對計算機的運行機制有精確的了解,以充分利用硬件資源達(dá)成自己的目標(biāo),因為硬件資源實在是太匱乏和寶貴了,程序員們需要榨干計算機硬件的每一滴血和汗才能完成任務(wù)。
這給 Guido 帶來很多困惑,用 C 實現(xiàn)個功能吧,完成度沒有問題,但是需要耗費大量時間。用 Shell 吧,面對復(fù)雜問題又束手無策。Shell 是 Unix/Linux 下的腳本語言,也叫膠水語言,它可以把系統(tǒng)的各種功能通過管道(比如:find . -name “*.java” | xargs grep chjq)的方式連接起來實現(xiàn)系統(tǒng)運維、定時任務(wù)、文件處理、程序安裝卸載等工作,但是處理復(fù)雜的數(shù)值運算或系統(tǒng)調(diào)用就很麻煩。這時候需求就來了,Guido 希望一門語言既能像 C 語言一樣能夠全面掌控計算機的資源,也能像 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)美和強大,是專門為非「專業(yè)程序員」設(shè)計的。但是 ABC 語言并沒有成功,究其原因,Guido 認(rèn)為是非開放造成的。Guido 決心在 Python 中避免這一錯誤,這一次他成功了。
1991年,第一個 Python 版本誕生,編譯器是 C 語言實現(xiàn)的,Python 語言可以非常方便的調(diào)用 C 語言實現(xiàn)的庫(這一點太重要了)。從一問世,Python 就是一個動態(tài)語言,面向?qū)ο缶幊痰恼Z言,具備類、函數(shù)、異常處理、列表(list)、詞典(dict)、元組等數(shù)據(jù)類型。
Python 的語法同時受到了 C 和 ABC 語言的影響,比如采用 def 來定義函數(shù),比如等號賦值,比如強制縮進(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ā)者和編程語言的特點,比如,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ū)懲炅恕?/p>
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 增加了什么了不得的特性,而是人工智能和機器學(xué)習(xí)的時代來臨了。
AI 時代的 Python
我來做一個不負(fù)責(zé)任的判斷,Python 將成為大數(shù)據(jù)、AI 和機器學(xué)習(xí)時代的第一編程語言。可以想象這樣一個場景,Python 和 Java、Go、C、C#、Ruby、PHP……坐在圓桌前開會,Python 抱著頭后仰在 Herman Miller 工程椅上,慵懶的對其他編程語言說:
對不起,我不是針對你,我是說,所有在座的各位,都只能掙第二。
當(dāng)然了,這個語言范疇是限定在大數(shù)據(jù)、AI 和機器學(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ù)分析和機器學(xué)習(xí)的框架都會選用 Python 做主要的開發(fā)或首選支持的語言呢?
一位女程序員穎兒的回答最靠譜:免費,簡潔,生態(tài)好,庫豐富,操心少;之前刷機器學(xué)習(xí)的題,用 C# 寫了一坨兒。結(jié)果人家引個 SciPy 庫,三行代碼搞定。
SciPy 是一個數(shù)值計算庫,NumPy 是 Python 另一個開源的數(shù)值計算擴展庫,Pandas 是基于 NumPy 的數(shù)據(jù)分析工具,matplotlib 是圖形繪制庫,最近火熱的 Scikit-learn 則是開源的機器學(xué)習(xí)框架。這些庫對于 Python 來說就三個字:「隨便用」。長此以往,圍繞 Python 語言構(gòu)建出來的生態(tài)庫讓其他語言望塵莫及,尤其是在科學(xué)計算、數(shù)據(jù)分析和機器學(xué)習(xí)領(lǐng)域。
以前我們說「木桶原理」是講一只水桶能裝多少水取決于它最短的那塊木板,所以我們應(yīng)該去思考和補齊自己的短板,才能成事。到了現(xiàn)代,知識爆炸信息擁堵,沒人有時間去補齊短板,能夠讓自己的長板足夠長就不錯了。短板怎么辦,找別人來補齊啊。能協(xié)作的組織和人才是最有生命力的。
Python 也是一樣。自誕生以來,一直保持了簡單、開放、語言工業(yè)化,具備良好的封裝、組合、嵌入能力,開發(fā)效率驚人。Python 把這些方面做到極致,其他的事情,留給別人去干嘛。
你們不是覺得 Python 慢么,自然有人給開發(fā)出 PyPy、Cython、Jython、Numba 這樣的編譯器工具來提高 Python 的效率。要進(jìn)行科學(xué)計算、大數(shù)據(jù)分析,好了,SciPy、Pandas 誕生了,要機器學(xué)習(xí),scikit-learn、Theano、Pylearn2 等機器學(xué)習(xí)庫開發(fā)出來了。Python 調(diào)用這些用 C 或者 Fortran 開發(fā)出來的庫比原生語言調(diào)用還方便,你說大家能不用 Python 么?
每當(dāng)新事物來臨的時候,總有很多專家里手對新手們豎起一道高墻,比如機器學(xué)習(xí)總被放到學(xué)術(shù)研究和 CS 科班出身這堵墻的后面,讓人望而生畏。其實,機器學(xué)習(xí)這個領(lǐng)域,同樣是個金字塔,這些專家和博士以及人工智能算法的創(chuàng)造者們,屬于塔尖的極少數(shù)人,他們發(fā)現(xiàn)原理,實現(xiàn)算法,引領(lǐng)潮流,突破極限,然后呢?基于這些算法和原理開發(fā)應(yīng)用和使用應(yīng)用的,是廣大的程序員和人民群眾,他們可能沒有那么高深的數(shù)學(xué)知識,不知道 Regression 和 Decision Tree 算法,不了解散步矩陣……那我們可以用 Python 調(diào)包啊,只要那些包足夠成熟就好了。
也許未來每個人與機器溝通的每一句話,就是喚起了一段 Python 代碼呢?
Python 的分裂
Python 2 和 Python 3 曾經(jīng)長期共存了數(shù)年之久,緣由很復(fù)雜,關(guān)于這個話題,足夠?qū)懥硪黄恼铝恕D壳肮俜奖硎緦?2 的支持到2020年,但 2 的生態(tài)庫遠(yuǎn)遠(yuǎn)大于 3,這就讓人很糾結(jié)。
關(guān)于該學(xué)哪個版本的常見問題,我的回復(fù)是,最好都學(xué),語法區(qū)別并不是很大。
馬哥學(xué)習(xí)交流群
馬哥教育-Python開發(fā)-1群 335068227
馬哥教育-Python開發(fā)-2群 608459685