標籤:ted ext mac os x 之間 電腦相關 進位 ++ 運行程式 2017年
認識python(瞭解)
一、Python發展背景
Python的作者,Guido von Rossum(吉多·范·羅蘇姆,中國Python程式員都叫他 龜叔),荷蘭人。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語言中增加功能,比如對圖形化的支援,就必須改動很多地方。
不能直接進行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的核心團隊。他們將自己大部分的業餘時間用於hack Python。隨後,Python拓 展到研究所之外。Python將許多機器層面上的細節隱藏,交給編譯器處理,並凸顯出邏輯層面的編程思考。Python程 序員可以花更多的時間用于思考程式的邏輯,而不是具體的實現細節。這一特徵吸引了廣大的程式員。Python開始流行。
人生苦短,我用python
電腦硬體越來越強大,Python又容易使用,所以許多人開始轉向Python。龜叔維護了一個mail list,Python使用者就通過郵件進行交流。Python使用者來自許多領域,有不同的背景,對Python也有不同的需求。Python相當的開放,又容 易拓展,所以當使用者不滿足於現有功能,很容易對Python進行拓展或改造。隨後,這些使用者將改動發給龜叔,並由龜叔決定是否將新的特徵加入到Python或者標準庫中。如果代碼能被納入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的發音與拼字
Python的作者是Guido van Rossum(龜叔)
Python正式誕生於1991年
Python的解譯器如今有多個語言實現,我們常用的是CPython(官方版本的C語言實現),其他還有Jython(可以運行在Java平台)、IronPython(可以運行在.NET和Mono平台)、PyPy(Python實現的,支援JIT即時編譯)
Python目前有兩個版本,Python2和Python3,最新版分別為2.7.13和3.6.2
Life is shot, you need Python. 人生苦短,我用Python。
程式設計語言熱門排行榜
(2017年8月,TIOBE 程式設計語言流行熱門排行榜)
四、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標準庫確實很龐大。它可以協助你處理各種工作,包括Regex、文檔產生、單元測試、線程、資料庫、網頁瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV檔案、密碼系統、GUI(圖形化使用者介面)、Tk和其他與系統有關的操作。記住,只要安裝了Python,所有這些功能都是可用的。這被稱作Python的“功能齊全”理念。除了標準庫以外,還有許多其他高品質的庫,如wxPython、Twisted和Python映像庫等等。
規範的代碼:Python採用強制縮排的方式使得代碼具有極佳的可讀性。
缺點
Python語言非常完善,沒有明顯的短板和缺點,唯一的缺點就是執行效率慢,這個是解釋型語言所通有的,同時這個缺點也將被電腦越來越強大的效能所彌補。
五、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指令碼。
網路爬蟲
Python有大量的HTTP請求處理庫和HTML解析庫,並且有成熟高效的爬蟲架構Scrapy和分布式解決方案scrapy-redis,在爬蟲的應用方面非常廣泛。
科學計算
NumPy、SciPy、Pandas、Matplotlib可以讓Python程式員編寫科學計算程式。
案頭軟體
PyQt、PySide、wxPython、PyGTK是Python快速開發傳統型應用程式的利器。
伺服器軟體(網路軟體)
Python對於各種網路通訊協定的支援很完善,因此經常被用於編寫伺服器軟體、網路爬蟲。第三方庫Twisted支援非同步網路編程和多數標準的網路通訊協定(包含用戶端和伺服器),並且提供了多種工具,被廣泛用於編寫高效能的伺服器軟體。
遊戲
很多遊戲使用C++編寫圖形顯示等高效能模組,而使用Python或者Lua編寫遊戲的邏輯、伺服器。相較於Python,Lua的功能更簡單、體積更小;而Python則支援更多的特性和資料類型。
構思實現,產品早期原型和迭代
Google、NASA、Facebook都在內部大量地使用Python。
認識python(瞭解)