開發與維運

Python的發展史 | 手把手教你入門Python之七

本文來自於千鋒教育在阿里雲開發者社區學習中心上線課程《Python入門2020最新大課》,主講人姜偉。

一、什麼是Python?

Python就是一門解釋型的編程語言,而且是現在世界上最流行的編程語言之一。
image.png

二、Python發展背景

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

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

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

吉多希望有一種語言,這種語言能夠像C語言那樣,能夠面調⽤用計算機的功能接口,又可以像shell那樣,可以輕鬆的編程。ABC語言讓吉多看到希望。ABC是由荷蘭的數學和計算機研究所開發的。吉多在該研究所工作,並參與到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語言不是模塊化語言。如果想在ABC語言中增加功能,比如對圖形化的支持,就必須改動很多地方。
  • 不能直接進行IO。ABC語言不能直接操作文件系統。儘管你可以通過諸如文本流的方式導入數據,但ABC無法直接讀寫文件。輸入輸出的困難對於計算機語言來說是致命的。你能想像一個打不開車門的跑車麼?
  • 過度革新。ABC用自然語言的方式來表達程序的意義,比如上面程序中的HOW TO 。然而對於程序員來說,他們更習慣用function或者define來定義一個函數。同樣,程序員更習慣用等號來分配變量。儘管ABC語言很特別,但學習難度也很大。
  • 傳播困難。ABC編譯器很大,必須被保存在磁帶上。當時吉多在訪問的時候,就必須有一個大磁帶來給別人安裝ABC編譯器。這樣,ABC語言就很難快速傳播。

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

三、Python語言的誕生

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

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

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

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

image.png

人生苦短,我用Python

計算機硬件越來越強大,Python又容易使用,所以許多人開始轉向Python。吉多維護了一個mail list,Python用戶就通過郵件進行交流。Python用戶來自許多領域,有不同的背景,對Python也有不同的需求。Python相當的開放,又容易拓展,所以當用戶不不滿足於現有功能,很容易對Python進行拓展或改造。隨後,這些用戶將改動發給吉多,並由吉多決定是否將新的特徵加入到Python或者標準庫中。如果代碼能被納入Python自身或者標準庫,這將極大的榮譽。由於吉多至⾼高無上的決定權,他因此被稱為“終身的仁慈獨裁者”。2018年7月12日,在完成PEP(Python Enhancement Proposals)572後,吉多決定退出Python核心決策層。

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

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

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

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

Python從其他語言中學到了很多,無論是已經進入歷史的ABC,還是依然在使用的C和Perl,以及許多沒有列出的其他語言。可以說,Python的成功代表了它所有借鑑的語言的成功。同樣,Ruby借鑑了Python,它的成功也代表了Python某些方面的成功。每個語言都是混合體,都有它優秀的地方,但也有各種各樣的缺陷。同時,一個語言“好與不好”的評判,往往受制於平臺、硬件、時代等等外部原因,程序員經歷過許多語言之爭。

四、關鍵點常識

  • Python是從ABC發展起來,並且結合了Unix shell和C語言的習慣。
  • Python的解釋器如今有多個語言實現,我們常用的是CPython(官方版本的C語言實現),其他還有Jython(可以運行在Java平臺)、IronPython(可以運行在.NET和Mono平臺)、PyPy(Python實現的,支持JIT即時編譯)
  • Python目前有兩個版本,Python2和Python3,最新版分別為2.7.16和3.7.3(截止至2019年4月)

五、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平臺!
  • 面向對象:Python既支持面向過程的編程也支持面向對象的編程。在“面向過程”的語言中,程序是由過程或僅僅是可重用代碼的函數構建起來的。在“面向對象”的語言中,程序是由數據和功能組合而成的對象構建起來的。與其他主要的語言如C++和Java相比,Python以一種非常強大又簡單的方式實現面向對象編程。
  • 可擴展性:如果你需要你的一段關鍵代碼運行得更快或者希望某些算法不公開,你可以把你的部分程序用C或C++編寫,然後在你的Python程序中使用它們。
  • 規範的代碼:Python採用強制縮進的方式使得代碼具有極佳的可讀性。
  • 解釋型語言:一個用編譯型語言比如C或C++寫的程序可以從源文件(即C或C++語⾔言)轉換到一個你的計算機使⽤用的語言(二進制代碼,即0和1)。這個過程通過編譯器和不同的標記、選項完成。當你運行你的程序的時候,連接/轉載器軟件把你的程序從硬盤複製到內存中並且運行。而Python語言寫的程序不需要編譯成二進制代碼。你可以直接從源代碼運行程序。在計算機內部,Python解釋器把源代碼轉換成稱為字節碼的中間形式,然後再把它翻譯成計算機使用的機器語言並運行。事實上,由於你不再需要擔心如何編譯程序,如何確保連接轉載正確的庫等等,所有這一切使得使用Python更加簡單。由於你只需要把你的Python程序拷貝到另外一臺計算機上,它就可以工作了,這也使得你的Python程序更加易於移植。
  • 豐富的庫:Python標準庫確實很龐大。它可以幫助你處理理各種工作,包括正則表達式、文檔生成、單元測試、線程、數據庫、網頁瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV文件、密碼系統、GUI(圖形用戶界⾯面)、Tk和其他與系統有關的操作。記住,只要安裝了Python,所有這些功能都是可用的。這被稱作Python的“功能齊全”理念。除了標準庫以外,還有許多其他高質量的庫,如wxPython、Twisted和Python圖像庫等等。

缺點

Python語言非常完善,沒有明顯的短板和缺點,唯一的缺點就是執行效率慢,這個是解釋型語言所通有的,同時這個缺點也將被計算機越來越強大的性能所彌補。

六、Python的設計哲學

Python的設計哲學總結起來就是:

  • 優雅
  • 明確:

    • 用一種方法,最好是隻有一種方法來做一件事
    • 如果面臨多種選擇,Python開發者一般會拒絕花俏的語法,而選擇明確沒有或很少有歧義的語法
  • 簡單:代碼像純英文一樣便於理解。

在Python的交互編程終端里輸入import this可以查看原文。下面是Python設計哲學原文及翻譯:

Beautiful is better than ugly. 優美勝於醜陋陋
Explicit is better than implicit. 明瞭了勝於晦澀
Simple is better than complex. 簡單勝過複雜
Complex is better than complicated. 複雜勝過凌亂
Flat is better than nested.      扁平勝於嵌套
Sparse is better than dense.      間隔勝於緊湊
Readability counts.           可讀性很重要
Special cases aren't special enough to break the rules. 即使假借特例的實用性之名,也不違
背這些規則
Although practicality beats purity.   雖然實用性次於純度
Errors should never pass silently.    錯誤不應該被無聲的忽略
Unless explicitly silenced.        除非明確的沉默       
In the face of ambiguity, refuse the temptation to guess. 當存在多種可能時,不要嘗試去猜測
There should be one-- and preferably only one --obvious way to do it. 應該有一個,最好只有一個,明顯能做到這一點
Although that way may not be obvious at first unless you're Dutch.雖然這種方式可能不容易,除非你是python之父
Now is better than never. 現在做總比不做好
Although never is often better than *right* now. 雖然過去從未比現在好
If the implementation is hard to explain, it's a bad idea. 如果這個實現不容易解釋,那麼它肯定是壞主意
If the implementation is easy to explain, it may be a good idea. 如果這個實現容易解釋,那麼它很可能是個好主意
Namespaces are one honking great idea -- let's do more of those! 命名空間是一種絕妙的理念,應當多加利用

配套視頻

Leave a Reply

Your email address will not be published. Required fields are marked *