人生苦短,我用 Python!不,人人都應該用Python!

編程語言 Python 機器學習 C語言 數字媒體乾貨 2017-05-28

知乎、豆瓣、Youtube等重度Python使用者是有其原因的!很多人說,語言在於用的好用的熟,其實說這句話的人大多是誤會了小編的初衷,固然野球拳練好了比什麼降龍十八掌還厲害(這裡看懂的暴露年齡了),但少走彎路還是大家都想要的。在這裡不想惹一身挑起口水的嫌疑,所以引用大拿池建強的精彩文章輸送營養,小編按照乾貨分量稍作調整。

人生苦短,我用 Python

人生苦短,我用 Python!不,人人都應該用Python!

2017-05-25 池建強 MacTalk MacTalk

我(池建強)和 Python

我接觸 Python 並不算早,第一次使用 Python 寫生產系統的程序是2004年,那時候我已經有了幾年的編程經驗。當然了,現在這年頭說早晚都不合適,昨天我說2000年就開始使用 Vim 編程了,有小夥伴回覆,那年我才12,這……多少有點尷尬。

早期用 Python 主要寫一些服務器端的工具,後來也寫後端服務,再後來還寫過內容抓取、數據分析和 Alfred 的插件等一系列雜七雜八的東西,簡單的工具用 Shell 寫,複雜的和龐大的用 C 或 Java 實現,中間的三不管地帶,用 Python 就好,每次都不會讓你失望。2005到2006年那段時間我參加了一個類似 Corba 的分佈式應用系統的開發,與國外的程序員合作,寫了大量的 Python 代碼。

Python 有什麼好處?功能強大,使用簡單,語言唯一性的特徵明顯(唯一性的意思就是你不能用十八種寫法實現一個功能),而且具備海量的第三方庫……Python 程序員最愛說的一句話是:人生苦短,我用 Python(也是 Python 之父的名言)。這句話與「PHP 是世界上最好的編程語言」一樣並世無雙,可謂「倚天不出,誰與爭鋒」。

Python 支持交互式編程、面向對象編程、函數式編程、面向切面編程、當然還有元編程。目前這門編程語言在兵器譜的排名是第四,前三位分別是Java、C 和C++。江湖上人稱四哥的,就是 Python。

人生苦短,我用 Python!不,人人都應該用Python!

Python 起源

Python 之父是 Guido van Rossum,荷蘭人。每個編程語言的作者都是一個技術傳奇,Guido 也不例外。他1982年從阿姆斯特丹大學畢業,獲得了數學和計算機兩個碩士學位,最愛做的事情就是編寫代碼。那個時代,流行的語言是彙編、C、Fortran 等,這些語言要求編程者對計算機的運行機制有精確的瞭解,以充分利用硬件資源達成自己的目標,因為硬件資源實在是太匱乏和寶貴了,程序員們需要榨乾計算機硬件的每一滴血和汗才能完成任務。

這給 Guido 帶來很多困惑,用 C 實現個功能吧,完成度沒有問題,但是需要耗費大量時間。用 Shell 吧,面對複雜問題又束手無策。Shell 是 Unix/Linux 下的腳本語言,也叫膠水語言,它可以把系統的各種功能通過管道(比如:find . -name “*.java” | xargs grep chjq)的方式連接起來實現系統運維、定時任務、文件處理、程序安裝卸載等工作,但是處理複雜的數值運算或系統調用就很麻煩。這時候需求就來了,Guido 希望一門語言既能像 C 語言一樣能夠全面掌控計算機的資源,也能像 Shell 一樣使用簡單,還具備交互性編程能力,輕輕鬆鬆編寫一些小的工具包。

普通人 —— 比如我 —— 有了這種需求就會對自己說,再等等,也許隔壁馮老師會做出來呢。馮老師的想法就更簡樸了,我又不寫代碼,關我什麼事。幸好 Guido 沒這麼想,Guido 對自己說的是,放著我來!

1989年的冬天,Guido 為了度過一個有意義的聖誕節,或者為了打發一個無聊的假期,開始編寫 Python 語言的編譯器和解釋器,靈感來自教學語言 ABC(你不知道還有這種語言吧)。為什麼叫 Python?因為 Guido 很喜歡 BBC 電視劇 —— 蒙提·派森的飛行馬戲團(Monty Python's Flying Circus)。ABC 則是由 Guido 參加設計的一種教學語言。Guido 一直認為 ABC 這種語言非常優美和強大,是專門為非「專業程序員」設計的。但是 ABC 語言並沒有成功,究其原因,Guido 認為是非開放造成的。Guido 決心在 Python 中避免這一錯誤,這一次他成功了。

1991年,第一個 Python 版本誕生,編譯器是 C 語言實現的,Python 語言可以非常方便的調用 C 語言實現的庫(這一點太重要了)。從一問世,Python 就是一個動態語言,面向對象編程的語言,具備類、函數、異常處理、列表(list)、詞典(dict)、元組等數據類型。

Python 的語法同時受到了 C 和 ABC 語言的影響,比如採用 def 來定義函數,比如等號賦值,比如強制縮進。如果你是個 C 或 Java 程序員,習慣了用大括號來劃分程序域 —— 其實大部分語言都是這麼做的 —— 看到 Python 是用縮進來搞定這件事,你馬上會覺得「Holy shit」,其實這種做法來自 ABC,Guido 的想法是,如果「常識」上確立的東西,沒有必要過度糾結。當然,這種常識是 Guido 的常識,至於其他人,你們會習慣的。

事實也是如此, Python 吸引了大量的程序員,他們開始協同改進這門語言,Python 開始了改變世界的征程。

2000年10月16日 Python 2.0 發佈,這次增加了實現完整的垃圾回收,並且支持 Unicode 編碼。Guido 在開發的過程中一直遵循了開放的原則,社區協作的模式從最初的郵件列表改為開源的方式,Python 吸收了大量開發者和編程語言的特點,比如,Python 中的正則表達參考了 Perl,而內置函數 lambda,map,reduce,filter 等則參考了 Lisp,無數優秀的程序員為 Python 添磚加瓦,Python 搞不定的,沒關係,我們用 C 實現,於是 Python 有了大量的函數庫,尤其在數據分析和科學計算領域。另外,函數在 Python 中是一等公民,所以 Python 同時也是一種函數式編程語言。

Python 穩步發展,成為了一代老牌編程語言。

Python 的應用

每個編程語言都有自己的 Hello World,Python 最為簡單。如果你有臺 Mac 電腦,Python 的 SDK 是默認安裝的。打開終端,輸入 python 進入 python shell 的交互界面,然後鍵入

>>> print “Hello World”

程序寫完了。

Python 這麼簡單,是不是一門玩具語言呢?當然不是。NASA 的火箭發射儀表盤系統使用了 Python 的 Tkinter —— 支持實時響應的 GUI 庫。NASA 的太陽物理學分詞庫 SunPy 也是基於 Python 寫的。YouTube 基於開發速度的考慮,大部分代碼是 Python 實現的,YouTube 的流量有多大,老百姓不知道,程序員應該知道。Google、Dropbox 更是大量採用 Python 語言(Guido 工作過的兩個地方)。國內的豆瓣、知乎也是 Python 的重度使用者。

雖然 Python 已經被廣泛使用了,但前幾年它在兵器譜上總是排 8-12 的位置。最近兩年事情開始發生變化,去年 Python 開始迅速攀升至第五名,今年更進一步,排名第四。為什麼會發生這種變化呢?並不是 Python 增加了什麼了不得的特性,而是人工智能和機器學習的時代來臨了。

AI 時代的 Python

我來做一個不負責任的判斷,Python 將成為大數據、AI 和機器學習時代的第一編程語言。可以想象這樣一個場景,Python 和 Java、Go、C、C#、Ruby、PHP……坐在圓桌前開會,Python 抱著頭後仰在 Herman Miller 工程椅上,慵懶的對其他編程語言說:

對不起,我不是針對你,我是說,所有在座的各位,都只能掙第二。

當然了,這個語言範疇是限定在大數據、AI 和機器學習領域。但是,如果這個領域在未來的應用足夠廣泛,那 Python 直接滅掉 Java 當大哥也不是不可能的。

Python 性能這麼差,對多核併發編程支持的也不好,並且長期分裂成了 Python 2 和 Python 3 兩個陣營,給開發者帶來了諸多不便和麻煩,為什麼能後來者居上呢?

因為 Python 遵循了現代的木桶原理。

Python 的木桶原理

提一個問題:為什麼很多數據分析和機器學習的框架都會選用 Python 做主要的開發或首選支持的語言呢?

一位女程序員穎兒的回答最靠譜:免費,簡潔,生態好,庫豐富,操心少;之前刷機器學習的題,用 C# 寫了一坨兒。結果人家引個 SciPy 庫,三行代碼搞定。

SciPy 是一個數值計算庫,NumPy 是 Python 另一個開源的數值計算擴展庫,Pandas 是基於 NumPy 的數據分析工具,matplotlib 是圖形繪製庫,最近火熱的 Scikit-learn 則是開源的機器學習框架。這些庫對於 Python 來說就三個字:「隨便用」。長此以往,圍繞 Python 語言構建出來的生態庫讓其他語言望塵莫及,尤其是在科學計算、數據分析和機器學習領域。

以前我們說「木桶原理」是講一隻水桶能裝多少水取決於它最短的那塊木板,所以我們應該去思考和補齊自己的短板,才能成事。到了現代,知識爆炸信息擁堵,沒人有時間去補齊短板,能夠讓自己的長板足夠長就不錯了。短板怎麼辦,找別人來補齊啊。能協作的組織和人才是最有生命力的。

Python 也是一樣。自誕生以來,一直保持了簡單、開放、語言工業化,具備良好的封裝、組合、嵌入能力,開發效率驚人。Python 把這些方面做到極致,其他的事情,留給別人去幹嘛。

你們不是覺得 Python 慢麼,自然有人給開發出 PyPy、Cython、Jython、Numba 這樣的編譯器工具來提高 Python 的效率。要進行科學計算、大數據分析,好了,SciPy、Pandas 誕生了,要機器學習,scikit-learn、Theano、Pylearn2 等機器學習庫開發出來了。Python 調用這些用 C 或者 Fortran 開發出來的庫比原生語言調用還方便,你說大家能不用 Python 麼?

每當新事物來臨的時候,總有很多專家裡手對新手們豎起一道高牆,比如機器學習總被放到學術研究和 CS 科班出身這堵牆的後面,讓人望而生畏。其實,機器學習這個領域,同樣是個金字塔,這些專家和博士以及人工智能算法的創造者們,屬於塔尖的極少數人,他們發現原理,實現算法,引領潮流,突破極限,然後呢?基於這些算法和原理開發應用和使用應用的,是廣大的程序員和人民群眾,他們可能沒有那麼高深的數學知識,不知道 Regression 和 Decision Tree 算法,不瞭解散步矩陣……那我們可以用 Python 調包啊,只要那些包足夠成熟就好了。

也許未來每個人與機器溝通的每一句話,就是喚起了一段 Python 代碼呢?

Python 的分裂

Python 2 和 Python 3 已經長期共存了數年之久,原因很複雜,對於這個話題,足夠寫另一篇文章了。目前官方表示對 2 的支持到2020年,但 2 的生態庫遠遠大於 3,這就讓人很糾結。

關於該學哪個版本的常見問題,我的回覆是,最好都學,語法區別並不是很大。

相關推薦

推薦中...