01 - Python 起源

MR_LP發表於2018-07-21

一、什麼是 Python?

最近感覺自己懈怠了很多,同時身邊總有雜事纏身,一直停滯不前。 所以想來想去,還是用老辦法,寫寫文章,沉澱一下。 最近 Python 大火,很多學校和機構也已經開設了 Python 的課程,甚至國家在小學的課本里,高考的考試裡也加入了 Python 的內容。 正好最近自己也在學習 Python ,那就嘗試將整個內容都整理出來,給後來的人一些學習經驗吧。

image
全文共5500字,閱讀要約10分鐘。

1.1 關於 Python 你需要知道

image

Python的作者,Guido von Rossum,荷蘭人。

  • Python的發音與拼寫
  • Python的意思是蟒蛇,源於作者喜歡的一部電視劇 (C呢?)
  • Python的作者是Guido van Rossum(龜叔)
  • Python是龜叔在1989年聖誕節期間,為了打發無聊的聖誕節而用C編寫的一個程式語言
  • Python正式誕生於1991年
  • Python的直譯器如今有多個語言實現,我們常用的是CPython(官方版本的C語言實現),其他還有Jython(可以執行在Java平臺)、IronPython(可以執行在.NET和Mono平臺)、PyPy(Python實現的,支援JIT即時編譯)
  • Python目前有兩個版本,Python2和Python3,最新版分別為2.7.14和3.7.0,現階段大部分公司用的是Python2
  • Life is shot, you need Python. 人生苦短,我用Python。

1.2 為什麼要開發 Python

1.2.1 歷史的發展

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

在那個時候,Guido接觸並使用過諸如Pascal、C、Fortran等語言。這些語言的基本設計原則是讓機器能更快執行。在80年代,雖然IBM和蘋果已經掀起了個人電腦浪潮,但這些個人電腦的配置很低。

比如早期的Macintosh,只有8MHz的CPU主頻和128KB的RAM(隨機存取儲存器,是與CPU直接交換資料的內部儲存器),一個大的陣列就能佔滿記憶體。所有的編譯器的核心是做優化,以便讓程式能夠執行。

為了增進效率,語言也迫使程式設計師像計算機一樣思考,以便能寫出更符合機器口味的程式。在那個時代,程式設計師恨不得用手榨取計算機每一寸的能力。有人甚至認為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語言希望讓語言變得容易閱讀,容易使用,容易記憶,容易學習,並以此來激發人們學習程式設計的興趣。

1.2.2 希望的誕生

比如下面是一段來自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行為。

1.2.3 Python 的誕生

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開始流行。

image

1.2.4 時勢造英雄

我們不得不暫停我們的Python時間,轉而看一看瞬息萬變的計算機行業。

1990年代初,個人計算機開始進入普通家庭。

Intel釋出了486處理器,windows釋出window 3.0開始的一系列視窗系統。

計算機的效能大大提高。程式設計師開始關注計算機的易用性,比如圖形化介面。

image

由於計算機效能的提高,軟體的世界也開始隨之改變。

硬體足以滿足許多個人電腦的需要。硬體廠商甚至渴望高需求軟體的出現,以帶動硬體的更新換代。

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升級成了物種豐富的熱帶雨林。

image

1.2.5 Python 的優點

  • 簡單
    • Python是一種代表簡單主義思想的語言。閱讀一個良好的Python程式就感覺像是在讀英語一樣,儘管這個英語的要求非常嚴格!Python的這種虛擬碼本質是它最大的優點之一。它使你能夠專注於解決問題而不是去搞明白語言本身。
  • 易學
    • 就如同你即將看到的一樣,Python極其容易上手。前面已經提到了,Python有極其簡單的語法。
  • 免費、開源
    • Python是FLOSS(自由/開放原始碼軟體)之一。簡單地說,你可以自由地釋出這個軟體的拷貝、閱讀它的原始碼、對它做改動、把它的一部分用於新的自由軟體中。FLOSS是基於一個團體分享知識的概念。這是為什麼Python如此優秀的原因之一——它是由一群希望看到一個更加優秀的Python的人創造並經常改進著的。
  • 高層語言
    • 當你用Python語言編寫程式的時候,你無需考慮諸如如何管理你的程式使用的記憶體一類的底層細節。
  • 可移植性
    • 由於它的開源本質,Python已經被移植在許多平臺上(經過改動使它能夠工作在不同平臺上)。如果你小心地避免使用依賴於系統的特性,那麼你的所有Python程式無需修改就可以在下述任何平臺上面執行。
    • 這些平臺包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至還有PocketPC、Symbian以及Google基於linux開發的Android平臺!
  • 解釋性
    • 這一點需要一些解釋。一個用編譯性語言比如C或C++寫的程式可以從原始檔(即C或C++語言)轉換到一個你的計算機使用的語言(二進位制程式碼,即0和1)。這個過程通過編譯器和不同的標記、選項完成。當你執行你的程式的時候,連線/轉載器軟體把你的程式從硬碟複製到記憶體中並且執行。而Python語言寫的程式不需要編譯成二進位制程式碼。你可以直接從原始碼執行程式。
    • 在計算機內部,Python直譯器把原始碼轉換成稱為位元組碼的中間形式,然後再把它翻譯成計算機使用的機器語言並執行。事實上,由於你不再需要擔心如何編譯程式,如何確保連線轉載正確的庫等等,所有這一切使得使用Python更加簡單。由於你只需要把你的Python程式拷貝到另外一臺計算機上,它就可以工作了,這也使得你的Python程式更加易於移植。
  • 物件導向
    • Python既支援程式導向的程式設計也支援物件導向的程式設計。在“程式導向”的語言中,程式是由過程或僅僅是可重用程式碼的函式構建起來的。在“物件導向”的語言中,程式是由資料和功能組合而成的物件構建起來的。與其他主要的語言如C++和Java相比,Python以一種非常強大又簡單的方式實現物件導向程式設計。
  • 可擴充套件性
    • 如果你需要你的一段關鍵程式碼執行得更快或者希望某些演算法不公開,你可以把你的部分程式用C或C++編寫,然後在你的Python程式中使用它們。
  • 豐富的庫
    • Python標準庫確實很龐大。它可以幫助你處理各種工作,包括正規表示式、文件生成、單元測試、執行緒、資料庫、網頁瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV檔案、密碼系統、GUI(圖形使用者介面)、Tk和其他與系統有關的操作。
    • 記住,只要安裝了Python,所有這些功能都是可用的。這被稱作Python的“功能齊全”理念。除了標準庫以外,還有許多其他高質量的庫,如wxPython、Twisted和Python影象庫等等。
  • 規範的程式碼
    • Python採用強制縮排的方式使得程式碼具有極佳的可讀性。

1.2.6 Python 的缺點

  • 執行速度,有速度要求的話,用C++改寫關鍵部分吧。
    • Python是解釋型語言,你的程式碼在執行時會一行一行地翻譯成CPU能理解的機器碼,這個翻譯過程非常耗時,所以很慢。而C程式是執行前直接編譯成CPU能執行的機器碼,所以非常快。
    • 但是大量的應用程式不需要這麼快的執行速度,因為使用者根本感覺不出來。例如開發一個下載MP3的網路應用程式,C程式的執行時間需要0.001秒,而Python程式的執行時間需要0.1秒,慢了100倍,但由於網路更慢,需要等待1秒,你想,使用者能感覺到1.001秒和1.1秒的區別嗎?這就好比F1賽車和普通的計程車在北京三環路上行駛的道理一樣,雖然F1賽車理論時速高達400公里,但由於三環路堵車的時速只有20公里,因此,作為乘客,你感覺的時速永遠是20公里。
  • 國內市場較小(國內以python來做主要開發的,目前只有一些web2.0公司)。但時間推移,目前很多國內軟體公司,尤其是遊戲公司,也開始規模使用他。
  • 中文資料匱乏(好的python中文資料屈指可數)。託社群的福,有幾本優秀的教材已經被翻譯了,但入門級教材多,高階內容還是隻能看英語版。
  • 構架選擇太多(沒有像C#這樣的官方.net構架,也沒有像ruby由於歷史較短,構架開發的相對集中。Ruby on Rails 構架開發中小型web程式天下無敵)。不過這也從另一個側面說明,python比較優秀,吸引的人才多,專案也多。
  • 程式碼不能加密。
    • 如果要釋出你的Python程式,實際上就是釋出原始碼,這一點跟C語言不同,C語言不用釋出原始碼,只需要把編譯後的機器碼(也就是你在Windows上常見的xxx.exe檔案)釋出出去。要從機器碼反推出C程式碼是不可能的,所以,凡是編譯型的語言,都沒有這個問題,而解釋型的語言,則必須把原始碼釋出出去。
    • 這個缺點僅限於你要編寫的軟體需要賣給別人掙錢的時候。好訊息是目前的網際網路時代,靠賣軟體授權的商業模式越來越少了,靠網站和移動應用賣服務的模式越來越多了,後一種模式不需要把原始碼給別人。
    • 再說了,現在如火如荼的開源運動和網際網路自由開放的精神是一致的,網際網路上有無數非常優秀的像Linux一樣的開原始碼,我們千萬不要高估自己寫的程式碼真的有非常大的“商業價值”。那些大公司的程式碼不願意開放的更重要的原因是程式碼寫得太爛了,一旦開源,就沒人敢用他們的產品了。

1.2.7 Python 的應用場景

  • Web應用開發
    • Python經常被用於Web開發。比如,通過mod_wsgi模組,Apache可以執行用Python編寫的Web程式。
    • Python定義了WSGI標準應用介面來協調Http伺服器與基於Python的Web程式之間的通訊。
    • 一些Web框架,如Django,TurboGears,web2py,Zope等,可以讓程式設計師輕鬆地開發和管理複雜的Web程式。
  • 作業系統管理、伺服器運維的自動化指令碼
    • 在很多作業系統裡,Python是標準的系統元件。 大多數Linux發行版以及NetBSD、OpenBSD和Mac OS X都整合了Python,可以在終端下直接執行Python。
    • 有一些Linux發行版的安裝器使用Python語言編寫,比如Ubuntu的Ubiquity安裝器,Red Hat Linux和Fedora的Anaconda安裝器。Gentoo Linux使用Python來編寫它的Portage包管理系統。
    • Python標準庫包含了多個呼叫作業系統功能的庫。通過pywin32這個第三方軟體 包,Python能夠訪問Windows的COM服務及其它Windows API。使用IronPython,Python程式能夠直接呼叫.Net Framework。
    • 一般說來,Python編寫的系統管理指令碼在可讀性、效能、程式碼重用度、擴充套件性幾方面都優於普通的shell指令碼。
  • 科學計算
    • NumPy,SciPy,Matplotlib可以讓Python程式設計師編寫科學計算程式。
  • 桌面軟體
    • PyQt、PySide、wxPython、PyGTK是Python快速開發桌面應用程式的利器。
  • 伺服器軟體(網路軟體)
    • Python對於各種網路協議的支援很完善,因此經常被用於編寫伺服器軟體、網路爬蟲。
    • 第三方庫Twisted支援非同步網路程式設計和多數標準的網路協議(包含客戶端和伺服器),並且提供了多種工具,被廣泛用於編寫高效能的伺服器軟體。
  • 遊戲
    • 很多遊戲使用C++編寫圖形顯示等高效能模組,而使用Python或者Lua編寫遊戲的邏輯、伺服器。
    • 相較於Python,Lua的功能更簡單、體積更小;而Python則支援更多的特性和資料型別。
  • 構思實現,產品早期原型和迭代
    • YouTube、Google、Yahoo!、NASA都在內部大量地使用Python。

相關文章