01 - Python 起源

1、什麼是 Python?

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

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

1.1 關於 Python 你須要知道

image

Python的做者,Guido von Rossum,荷蘭人。linux

  • 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和蘋果已經掀起了我的電腦浪潮,但這些我的電腦的配置很低。web

好比早期的Macintosh,只有8MHz的CPU主頻和128KB的RAM(隨機存取存儲器,是與CPU直接交換數據的內部存儲器),一個大的數組就能佔滿內存。全部的編譯器的核心是作優化,以便讓程序可以運行。正則表達式

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

這種編程方式讓Guido感到苦惱。Guido知道如何用C語言寫出一個功能,但整個編寫過程須要耗費大量的時間,即便他已經準確的知道了如何實現。他的另外一個選擇是shell。shell

Bourne Shell做爲UNIX系統的解釋器已經長期存在。UNIX的管理員們經常用shell去寫一些簡單的腳本,以進行一些系統維護的工做,好比按期備份、文件系統管理等等。shell能夠像膠水同樣,將UNIX下的許多功能鏈接在一塊兒。數據庫

許多C語言下上百行的程序,在shell下只用幾行就能夠完成。然而,shell的本質是調用命令。它並非一個真正的語言。好比說,shell沒有數值型的數據類型,加法運算都很複雜。總之,shell不能全面的調動計算機的功能。編程

Guido但願有一種語言,這種語言可以像C語言那樣,可以全面調用計算機的功能接口,又能夠像shell那樣,能夠輕鬆的編程。ABC語言讓Guido看到但願。ABC是由荷蘭的數學和計算機研究所開發的。Guido在該研究所工做,並參與到ABC語言的開發。ABC語言以教學爲目的。與當時的大部分語言不一樣,ABC語言的目標是「讓用戶感受更好」。ABC語言但願讓語言變得容易閱讀,容易使用,容易記憶,容易學習,並以此來激發人們學習編程的興趣。windows

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/二、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。
相關文章
相關標籤/搜索