淺談PYTHON

 

結緣

我瞭解 Python 最早來源於 Python 的一段格言,就下面一段話將我征服了,格言其實是對軟件開發的哲學理念和設計思想,也是一個大佬對於軟件的感悟,看了這段感悟我就在想,作者這麼高的境界,那麼搞出來的編程語言能差到哪裏呢?

優美勝於醜陋,明晰勝於隱晦 簡單勝於複雜,複雜勝於繁蕪 扁平勝於嵌套,稀疏勝於密集 可讀性很重要。 雖然實用性比純粹性更重要, 但特例並不足以把規則破壞掉。 錯誤狀態永遠不要忽略, 除非你明確地保持沉默, 直面多義,永不臆斷。 最佳的途徑只有一條,然而他並非顯而易見————誰叫你不是荷蘭人? 置之不理或許會比慌忙應對要好, 然而現在動手遠比束手無策更好。 難以解讀的實現不會是個好主意, 容易解讀的或許纔是。 名字空間就是個頂呱呱好的主意。 讓我們想出更多的好主意!

其實 Python 已經是一個很老的編程語言了,到現在(2019年) Python 已經高齡 28 歲,比很多程序員的年齡都大,2015 年的時候需要爬取某個網站的數據,利用了幾天的時間寫了一個小的 Python 爬蟲程序,一下子對 Python 產生了興趣,後來陸陸續續寫過幾個小爬蟲,但由於工作原因,還沒有進行過系統學習。

如今,Python 已經是必須瞭解的編程語言了,Python 在爬蟲、機器學習等領域的優勢越來越明顯,並且可以利用 Python 做很多有趣的小工具,因此接下來的一段時間,準備好好學習 Python 的使用。

當我準備在網上寫寫 Python 的發展歷史時,發現博客園的 vamei 也寫過一篇類似的文章非常精彩,後面內容大多摘錄於此文《Python 簡史》。

 

起源

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

在那個時候,他接觸並使用過諸如 Pascal、C、 Fortran 等語言。這些語言的基本設計原則是讓機器能更快運行。在80年代,雖然IBM和蘋果已經掀起了個人電腦浪潮,但這些個人電腦的配置很低 (在今天看來)。比如早期的 Macintosh,只有 8MHz 的 CPU 主頻和 128KB 的 RAM,一個大的數組就能佔滿內存。

所有的編譯器的核心是做優化,以便讓程序能夠運行。爲了增進效率,語言也迫使程序員像計算機一樣思考,以便能寫出更符合機器口味的程序。在那個時代,程序員恨不得用手榨取計算機每一寸的能力。有人甚至認爲C語言的指針是在浪費內存。至於動態類型,內存自動管理,面向對象…… 別想了,那會讓你的電腦陷入癱瘓。

然而,這種思考方式讓 Guido 感到苦惱。Guido 知道如何用 C 語言寫出一個功能,但整個編寫過程需要耗費大量的時間 (即使他已經準確的知道了如何實現)。他的另一個選擇是 shell。Bourne Shell 作爲 UNIX 系統的解釋器(interpreter)已經長期存在。UNIX 的管理員們常常用 shell 去寫一些簡單的腳本,以進行一些系統維護的工作,比如定期備份、文件系統管理等等。

shell 可以像膠水一樣,將 UNIX下 的許多功能連接在一起。許多 C 語言下上百行的程序,在 shell 下只用幾行就可以完成。然而,shell 的本質是調用命令。它並不是一個真正的語言。比如說,shell 沒有數值型的數據類型,加法運算都很複雜。總之,shell 不能全面的調動計算機的功能。

Guido 希望有一種語言,這種語言能夠像 C 語言那樣,能夠全面調用計算機的功能接口,又可以像 shell 那樣,可以輕鬆的編程。ABC 語言讓 Guido 看到希望。

ABC 是由荷蘭的 CWI (Centrum Wiskunde & Informatica, 數學和計算機研究所)開發的。Guido 在 CWI 工作,並參與到 ABC 語言的開發。ABC 語言以教學爲目的。與當時的大部分語言不同,ABC 語言的目標是“讓用戶感覺更好”。ABC 語言希望讓語言變得容易閱讀,容易使用,容易記憶,容易學習,並以此來激發人們學習編程的興趣。

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

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

  • 不能直接進行 IO。ABC 語言不能直接操作文件系統。儘管你可以通過諸如文本流的方式導入數據,但 ABC 無法直接讀寫文件。輸入輸出的困難對於計算機語言來說是致命的。你能想像一個打不開車門的跑車麼?

  • 過度革新。ABC 用自然語言的方式來表達程序的意義,比如上面程序中的 HOW TO (如何)。然而對於程序員來說,他們更習慣用 function 或者 define 來定義一個函數。同樣,程序員也習慣了用等號(=)來分配變量。這儘管讓 ABC 語言顯得特別,但實際上增加了程序員的學習難度 (程序員大都掌握不止一種語言)。

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

 

 

1989年,爲了打發聖誕節假期,Guido 開始寫 Python 語言的編譯/解釋器。Python 來自 Guido 所摯愛的電視劇 Monty Python's Flying Circus (BBC1960-1970年代播放的室內情景幽默劇,以當時的英國生活爲素材)。他希望這個新的叫做 Python 的語言,能實現他的理念(一種 C 和 shell 之間,功能全面,易學易用,可拓展的語言)。Guido 作爲一個語言設計愛好者,已經有過設計語言的(不很成功)的嘗試。這一次,也不過是一次純粹的 hacking 行爲。

 

一門語言的誕生

1991年,第一個 Python 編譯器(同時也是解釋器)誕生。它是用 C 語言實現的,並能夠調用 C 庫(.so文件)。從一出生,Python 已經具有了:類(class),函數(function),異常處理(exception),包括表(list)和詞典(dictionary)在內的核心數據類型,以及模塊(module)爲基礎的拓展系統。

最初的 Python logo: 由 Guido 的兄弟 Just von Rossum 設計

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

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

最初的 Python 完全由 Guido 本人開發。Python 得到 Guido 同事的歡迎。他們迅速的反饋使用意見,並參與到 Python 的改進。Guido 和一些同事構成 Python 的核心團隊。他們將自己大部分的業餘時間用於 hack Python (也包括工作時間,因爲他們將 Python 用於工作)。隨後,Python 拓展到 CWI 之外。Python 將許多機器層面上的細節隱藏,交給編譯器處理,並凸顯出邏輯層面的編程思考。Python 程序員可以花更多的時間用於思考程序的邏輯,而不是具體的實現細節 (Guido 有一件T恤,寫着:人生苦短,我用 Python)。這一特徵吸引了廣大的程序員。Python 開始流行。

時勢造英雄

我們不得不暫停我們的 Python 時間,轉而看一看這時的計算機概況。1990 年代初,個人計算機開始進入普通家庭。Intel 發佈了 486 處理器,windows 發佈window 3.0 開始的一系列視窗系統。計算機的性能大大提高。程序員開始關注計算機的易用性 (比如圖形化界面)。

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

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

硬件性能不是瓶頸,Python 又容易使用,所以許多人開始轉向 Python。Guido 維護了一個 maillist,Python 用戶就通過郵件進行交流。Python 用戶來自許多領域,有不同的背景,對 Python 也有不同的需求。Python 相當的開放,又容易拓展,所以當用戶不滿足於現有功能,很容易對 Python 進行拓展或改造。隨後,這些用戶將改動發給 Guido,並由 Guido 決定是否將新的特徵加入到 Python 或者標準庫中。如果代碼能被納入 Python 自身或者標準庫,這將極大的榮譽。Python 自身也因此變得更好。

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

(由於 Guido 享有絕對的仲裁權,所以在 Python 早期 maillist 的開發時代,不少愛好者相當擔心 Guido 的生命。他們甚至作出假設:如果 Guido 掛了的話,Python 會怎樣。)

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

今天 Python 已經進入到 3.0 的時代。由於 Python 3.0 向後不兼容,所以從 2.0 到 3.0 的過渡並不容易。另一方面,Python 的性能依然值得改進,Python 的運算性能低於 C++ 和 Java。Python 依然是一個在發展中的語言。我期待看到 Python 的未來。

 

Python 啓示錄

Python 崇尚優美、清晰、簡單,是一個優秀並廣泛使用的語言 (TIOBE 語言排行第三,Google 的第三大開發語言,Dropbox 的基礎語言,豆瓣的服務器語言)。這個世界並不缺乏優秀的語言,但 Python 的發展史作爲一個代表,帶給我許多啓示。

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

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

說不定哪一天發現,我不喜歡的某個語言中,正包含了我所需要的東西。無論 Python 未來的命運如何,Python的歷史已經是本很有趣的小說。

 

Python 發展史

  • 1989 年由荷蘭人 Guido van Rossum 於1989年發明,第一個公開發行版發行於1991年

  • Python 1.0 - January 1994 增加了 lambda, map, filter and reduce.

  • Python 2.0 - 2000-10-13,加入了內存回收機制,構成了現在 Python 語言框架的基礎

  • Python 2.4 - 2004-11-10, 同年目前最流行的 WEB 框架 Django 誕生

  • Python 2.5 - 2006-9-19

  • Python 2.6 - 2008-10-1

  • Python 2.7 - 2010-7-3

  • Python 3.0 - 2008-12-3

  • Python 3.1 - 2009-6-27

  • Python 3.2 - 2011-2-20

  • Python 3.3 - 2012-9-29

  • Python 3.4 - 2014-3-16

  • Python 3.5 - 2015-9-13

  • Python 3.6 - 2016-12-23

  • Python 3.7 - 2018-06-27

 

爲什麼使用 Python 的人越來越多?

Python 被應用在衆多領域:

  • 數據分析: 2016/2月/11,美國科學家宣佈發現引力波,分析觀測30年的數據。分析引力波數據的Python包:GWPY

  • 雲計算 : 典型應用——Python 開發的 OpenStack

  • WEB開發: 衆多優秀的 WEB 框架,Django、flask、 tornado

  • 科學運算、人工智能: 典型庫 NumPy, SciPy, Matplotlib, Enthought librarys,pandas。

  • 系統運維: 運維人員必備,slatstack(系統自動化配置和管理工具),Ansible(自動化運維工具)

  • 圖形開發: wxPython、PyQT、TKinter

  • ……

Python 除了極少的事情不能做之外,基本上可以說全能,系統運維、圖形處理、數學處理、文本處理、數據庫編程、網絡編程、web 編程 、多媒體應用、pymo 引擎、黑客編程、爬蟲編寫、機器學習、人工智能等等。

隨着編程領域的發展,Python 因爲有着最牛逼的開發社區提供了 N 多方便的功能和框架,開發者社區的不斷強大推動了 Python 在各個領域的發展,特別是在爬蟲和機器學習領域有更廣泛的應用基礎。

 

Python 的現況

截止2019年2月,Python 在 TIOBE 流行編程語言排行榜,已經上升到第三名。比上個月上升了 2.41% 個百分點。

 

 

而且如果看 2002-2018 年 Python 的使用情況, Python 明顯就是一個赤裸裸的逆襲爆發史呀。

 

 

我們把 TIOBE 排行榜中 其它編程語言隱藏掉就會發現 Python 語言的熱點一直在震盪上行,特別是從 2017 年開始,呈現出爆發的現象。

 

 

那麼此時不學 Python ,更待何時?

如需更多的瞭解加入python裙906407826嗷~🤭

發佈了213 篇原創文章 · 獲贊 21 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章