首頁  >  文章  >  後端開發  >  人生苦短 我用Python

人生苦短 我用Python

伊谢尔伦
伊谢尔伦原創
2016-11-25 09:56:571133瀏覽

Python是我喜歡的語言,簡潔、優美、易用。前兩天,我很激昂地向朋友宣傳Python的好處。

  「好吧,我承認Python不錯,但為什麼它叫Python呢?」

  「呃,似乎是個電視劇的名字。」

  「那〜 「那〜〜〜〜〜〜〜〜〜〜〜〜〜〜〟「那〜㟜〜㟜㟟〜就是美國人」是美國人》是美國人?從Google換到Dropbox工作,但他的名字像是荷蘭人的。我看到了Python中許多功能的來源和Python的設計概念,看到了一門程式語言的演化歷史,看到了Python與開源運動的奇妙連結。從Python的歷史中,我們可以一窺開源開發的理念和成就。

  這也可以作為我寫的Python快速教學的序篇。

 起源

  Python的作者,Guido von Rossum,確實是荷蘭人。 1982年,Guido從阿姆斯特丹大學獲得了數學和電腦碩士學位。然而,儘管他算得上是一位數學家,但他更加享受計算機 帶來的樂趣。用他的話來說,儘管擁有數學和計算機雙料資質,他總趨向於做計算機相關的工作,並熱衷於做任何和編程相關的活兒。

  在那個時候,Guido接觸並使用過諸如Pascal、C、 Fortran等語言。這些語言的基本設計原則是讓機器能更快運作。在80年代,雖然IBM和蘋果已經掀起了個人電腦浪潮,但這些個人電腦的配置卻很低。比 如早期的Macintosh,只有8MHz的CPU主頻和128KB的RAM,一個大的陣列就能佔滿記憶體。所有的編譯器的核心是做最佳化,以便讓程式能夠運作 行。為了增進效率,語言也迫使程式設計師像電腦一樣思考,以便能寫出更符合機器口味的程式。在那個時代,程式設計師恨不得用手榨取電腦每一寸的能力。有人甚至 認為C語言的指標是在浪費記憶體。至於動態類型,記憶體自動管理,物件導向…… 別想了,那會讓你的電腦陷入癱瘓。

  這種程式設計方式讓Guido感到苦惱。 Guido知道如何用C語言寫出一個功能,但整個編寫過程需要耗費大量的時間,即使他已經準確的知道瞭如何實 現。他的另一個選擇是shell。 Bourne Shell作為UNIX系統的解譯器已經長期存在。 UNIX的管理員常常用shell去寫一些簡單的腳本,以進行一些系統維護的工作,例如定期備份、文 件系統管理等等。 shell可以像膠水一樣,將UNIX下的許多功能連接在一起。許多C語言下上百行的程序,在shell下只用幾行就可以完成。然 而,shell的本質是呼叫指令。它並不是一個真正的語言。比如說,shell沒有數值型的資料型態,加法運算都很複雜。總之,shell不能全面的調動 計算機的功能。

  Guido希望有一種語言,這種語言能夠像C語言那樣,能夠全面調用計算機的功能接口,又可以像shell那樣,可以輕鬆的編程。 ABC語言讓 Guido看到希望。 ABC是由荷蘭的數學和計算機研究所開發的。 Guido在該研究所工作,並參與到ABC語言的開發。 ABC語言以教學為目的。與當時 的大部分語言不同,ABC語言的目標是「讓使用者感覺更好」。 ABC語言希望讓語言變得容易閱讀,容易使用,容易記憶,容易學習,並以此來激發人們學習程式設計 的興趣。例如下面是一段來自Wikipedia的ABC程序,這個程式用來統計文本中出現的字的總數:

HOW TO RETURN words document:
 
   PUT {} IN collection
 
   FOR line IN document:
 
      FOR word IN split line:
 
         IF word not.in collection:
 
            INSERT word IN collection
 
   RETURN collection

  HOW TO用來定義一個函數。一個Python程式設計師應該很容易理解這段程式。 ABC語言使用冒號和縮排表示程式區塊。行尾沒有分號。 for和if結構中也沒有括號()。賦值採用的是PUT,而不是更常見的等號。這些改動讓ABC程式讀起來像一段文字。

  儘管已經具備了良好的可讀性和易用性,ABC語言最終沒有流行起來。在當時,ABC語言編譯器需要比較高配置的電腦才能運作。而這些電腦的使用者通常精通計算機,他們更考慮程式的效率,而不是它的學習難度。除了硬體上的困難外,ABC語言的設計也存在一些致命的問題:

  可拓展性差。 ABC語言不是模組化語言。如果想在ABC語言中增加功能,例如對圖形化的支持,就必須改變很多地方。

  不能直接進行IO。 ABC語言不能直接操作檔案系統。儘管你可以透過諸如文字流的方式匯入數據,但ABC無法直接讀寫檔案。輸入輸出的困難對於電腦語言來說是致命的。你能想像一個打不開車門的跑車麼?

  過度革新。 ABC用自然語言的方式來表達程式的意義,例如上面程式中的HOW TO 。然而對於程式設計師來說,他們更習慣用function或define來定義一個函數。同樣,程式設計師更習慣用等號來分配變數。儘管ABC語言很特別,但學習難度也很大。

  傳播困難。 ABC編譯器很大,必須保存在磁帶上。當時Guido在訪問的時候,就必須有一個大磁鐵來為別人安裝ABC編譯器。 這樣,ABC語言就很難快速傳播。

  1989年,為了打發聖誕節假期,Guido開始寫Python語言的編譯器。 Python這個名字,來自Guido所摯愛的電視劇Monty Python’s Flying Circus。他希望這個新的叫做Python的語言,能符合他的理想:創造一種C和shell之間,功能全面,易學易用,可拓展的語言。 Guido作為 語言設計愛好者,已經有設計語言的嘗試。這一次,也不過是一次純粹的hacking行為。

 一門語言的誕生

  1991年,第一個Python編譯器誕生。它是用C語言實現的,並且能夠呼叫C語言的函式庫檔。從一出生,Python已經具有了:類,函數,異常處理,包含表和字典在內的核心資料類型,以及模組為基礎的拓展系統。

  Python文法很多來自C,但又受到ABC語言的強烈影響。來自ABC語言的一些規定直到今天還富有爭議,例如強制縮排。但這些語法規定讓 Python容易讀。另一方面,Python聰明的選擇服從一些慣例,特別是C語言的慣例,例如回歸等號賦值。 Guido認為,如果「常識」上確立的東 西,就沒有必要過度糾結。

  Python從一開始就特別在意可拓展性。 Python可以在多個層次拓展。從高層上,你可以直接引入.py檔。在底層,你可以引用C語言的 函式庫。 Python程式設計師可以快速的使用Python寫.py檔作為拓展模組。但當性能是考慮的重要因素時,Python程式設計師可以深入底層,寫C程序, 編譯為.so檔引入到Python中使用。 Python就好像是使用鋼建造房一樣,先規定好大的框架。而程式設計師可以在此框架下相當自由的拓展或更改。

  最初的Python完全由Guido本人開發。 Python得到Guido同事的歡迎。他們迅速的回饋使用意見,並參與Python的改進。 Guido和一些同事組成Python的核心團隊。他們將自己大部分的業餘時間用於hack Python。隨後,Python拓展到研究所之外。 Python將許多機器層面上的細節隱藏,交給編譯器處理,並凸顯出邏輯層面的程式思考。 Python程式設計師可以花更多的時間用於思考程式的邏輯,而不是具體的實作細節。這項特徵吸引了廣大的程式設計師。 Python開始流行。

 人生苦短,我用python

 時勢造英雄

  我們不得不暫停我們的Python時間,轉而看一看瞬息萬變的計算機行業。 1990年代初,個人電腦開始進入一般家庭。 Intel發布了486處 理器,windows發佈window 3.0開始的一系列視窗系統。計算機的性能大大提高。程式設計師開始注意電腦的易用性 ,例如圖形化介面。

人生苦短 我用Python

Windows 3.0

  由於電腦效能的提高,軟體的世界也開始隨之改變。硬體足以滿足許多個人電腦的需求。硬體廠商甚至渴望高需求軟體的出現,以帶動硬體的更新換代。 C++和Java相繼流行。 C++和Java提供了物件導向的程式設計範式,以及豐富的物件函式庫。在犧牲了一定的效能的代價下,C++和Java大大提高了程式 的產量。語言的易用性被提到一個新的高度。我們還記得,ABC失敗的一個重要原因是硬體的效能限制。從這方面說,Python要比ABC幸運許多。

  另一個悄悄發生的改變是Internet。 1990年代還是個人電腦的時代,windows和Intel挾PC以令天下,盛極一時。儘管 Internet為主體的資訊革命尚未到來,但許多程式設計師以及資深電腦使用者已經在頻繁使用Internet進行交流,例如使用email和 newsgroup。 Internet讓資訊交流成本大為下降。一種新的軟體開發模式開始流行:開源。程式設計師利用業餘時間進行軟體開發,並開放原始碼。 1991年,Linus在comp.os.minix新聞群組上發布了Linux內核原始碼,吸引大批hacker的加入。 Linux和GNU相互合作,最 終構成了一個充滿活力的開源平台。

  硬體效能不是瓶頸,Python又容易使用,所以許多人開始轉向Python。 Guido維護了一個maillist,Python用戶就透過郵件 進行交流。 Python使用者來自許多領域,有不同的背景,對Python也有不同的需求。 Python相當的開放,又容易拓展,所以當使用者不滿足於現有功 能,很容易對Python進行拓展或改造。隨後,這些使用者將改動發給Guido,並由Guido決定是否將新的特徵加入Python或標準庫。如果 程式碼能被納入Python本身或標準函式庫,這將極大的榮譽。由於Guido至高無上的決定權,他因此被稱為「終身的仁慈獨裁者」。

  Python被稱為“Battery Included”,是說它以及其標準庫的功能強大。這些都是整個社區的貢獻。 Python的開發者來自不同領域,他們將不同領域的優點帶給Python。 例如Python標準函式庫中的正規表示是參考Perl,而lambda, map, filter, reduce等函數參考了Lisp。 Python本身的一些功能以及大部分的標準函式庫來自社群。 Python的社群不斷擴大,進而擁有了自己的 newsgroup,網站,以及基金。從Python 2.0開始,Python也從maillist的開發方式,轉為完全開源的開發方式。社區氣氛已經形成,工作被整個社區分擔,Python也獲得了更高 速的發展。

  到今天,Python的框架已經確立。 Python語言以物件為核心組織程式碼,支援多種程式設計範式,採用動態類型,自動進行記憶體回收。 Python支 持解釋運行,並能呼叫C函式庫進行拓展。 Python有強大的標準函式庫。由於標準函式庫的系統已經穩定,所以Python的生態系開始拓展到第三方包。這些包,如 Django、web.py、wxpython、numpy、matplotlib、PIL,將Python升級成了物種豐富的熱帶雨林。

 啟示錄

  Python崇尚優美、清晰、簡單,是個優秀且廣泛使用的語言。 Python在TIOBE排行榜中排行第八,它是Google的第三大開發語言,Dropbox的基礎語言,豆瓣的伺服器語言。 Python的發展史可以作為一個代表,帶給我許多啟示。

  在Python的開發過程中,社群扮演了重要的角色。 Guido自認為自己不是全能型的程式設計師,所以他只負責訂製框架。如果問題太複雜,他會選擇繞 過去,也就是cut the corner。這些問題最終由社區中的其他人解決。社區中的人才是異常豐富的,就連創建網站,籌集基金這樣與開發稍遠的事情,也有人樂意處理。現今的項 目開發越來越複雜,越來越龐大,合作以及開放的心態成為專案最終成功的關鍵。

  Python從其他語言中學到了很多,無論是已經進入歷史的ABC,還是仍然在使用的C和Perl,以及許多沒有列出的其他語言。可以 說,Python的成功代表了它所有藉鏡的語言的成功。同樣,Ruby借鑒了Python,它的成功也代表了Python某些方面的成功。每個語言都是混 合體,都有它優秀的地方,但也有各種各樣的缺陷。同時,一個語言「好與不好」的評判,往往受制於平台、硬體、時代等等外在原因。程式設計師經歷過許多語言之 爭。其實,以開放的心態來接受各個語言,說不定哪一天,程式設計師也可以如Guido那樣,混合出自己的語言。

  無論Python未來的命運如何,Python的歷史已經是本很有趣的小說。


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn