天天看點

《Python核心程式設計(第二版)》——1.3 特點

本節書摘來自異步社群《python核心程式設計(第二版)》一書中的第1章,第1.3節,作者[美]wesley j. chun,宋吉廣 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

盡管python已經流行了超過15年,但是一些人仍舊認為相對于通用軟體開發産業而言,它還是個新丁。我們應當謹慎地使用“相對”這個詞,因為“網絡時代”的程式開發,幾年看上去就像幾十年。

當人們詢問:“什麼是python?”的時候,很難用任何一個具象來描述它。人們更傾向于一口氣不加思索地說出他們對python的所有感覺,python是____(請填寫),這些特點究竟又是什麼呢?為了讓你能知其是以然,我們下面會對這些特點進行逐一地闡釋。

伴随着每一代程式設計語言的産生,我們會達到一個新的高度。彙編語言是獻給那些掙紮在機器代碼中的人的禮物,後來有了fortran、c和 pascal語言,它們将計算提升到了嶄新的高度,并且開創了軟體開發行業。伴随着c語言誕生了更多的像c++、java這樣的現代編譯語言。我們沒有止步于此,于是有了強大的、可以進行系統調用的解釋型腳本語言,例如tcl、perl和python。

這些語言都有進階的資料結構,這樣就減少了以前“架構”開發需要的時間。像python中的清單(大小可變的數組)和字典(哈希表)就是内建于語言本身的。在核心語言中提供這些重要的建構單元,可以鼓勵人們使用它們,縮短開發時間與代碼量,産生出可讀性更好的代碼。

在c語言中,對于混雜數組(python中的清單)和哈希表(python中的字典)還沒有相應的标準庫,是以它們經常被重複實作,并被複制到每個新項目中去。這個過程混亂而且容易産生錯誤。c++使用标準模闆庫改進了這種情況,但是标準模闆庫是很難與python内建的清單和字典的簡潔和易讀相提并論的。

建議:面向對象程式設計為資料和邏輯相分離的結構化和過程化程式設計添加了新的活力。面向對象程式設計支援将特定的行為、特性以及和/或功能與它們要處理或所代表的資料結合在一起。python的面向對象的特性是與生俱來的。然而,python絕不像java或ruby僅僅是一門面向對象語言,事實上它融彙了多種程式設計風格。例如,它甚至借鑒了一些像lisp和haskell這樣的函數語言的特性。

大家常常将python與批處理或unix系統下的shell相提并論。簡單的shell腳本可以用來處理簡單的任務,就算它們可以在長度上(無限度的)增長,但是功能總會有所窮盡。shell腳本的代碼重用度很低,是以,你隻能止步于小項目。實際上,即使一些小項目也可能導緻腳本又臭又長。python卻不是這樣,你可以不斷地在各個項目中完善你的代碼,添加額外的新的或者現存的python元素,也可以随時重用代碼。python提倡簡潔的代碼設計、進階的資料結構和子產品化的元件,這些特點可以讓你在提升項目的範圍和規模的同時,確定靈活性、一緻性并縮短必要的調試時間。

“可更新”這個術語最經常用于衡量硬體的負載,通常指為系統添加了新的硬體後帶來的性能提升。我們樂于在這裡對這個引述概念加以區分,我們試圖用“可更新”來傳達一種觀念,這就是:python提供了基本的開發子產品,你可以在它上面開發你的軟體,而且當這些需要擴充和增長時,python的可插入性和子產品化架構則能使你的項目生機盎然和易于管理。

就算你的項目中有大量的python代碼,你也依舊可以有條不紊地通過将其分離為多個檔案或子產品加以組織管理。而且你可以從一個子產品中選取代碼,而從另一個子產品中讀取屬性。更棒的是,對于所有子產品,python的通路文法都是相同的。不管這個子產品是python标準庫中的還是你一分鐘之前創造的,哪怕是你用其他語言寫的擴充都沒問題!借助這些特點,你會感覺自己根據需要“擴充”了這門語言,而且你已經這麼做了。

代碼中的瓶頸,可能是在性能分析中總排在前面的那些熱門或者一些特别強調性能的地方,可以作為python擴充用c重寫。需要重申的是,這些接口和純python子產品的接口是一模一樣的,乃至代碼和對象的通路方法也是如出一轍的。唯一不同的是,這些代碼為性能帶來了顯著的提升。自然,這全部取決你的應用程式以及它對資源的需求情況。很多時候,使用編譯型代碼重寫程式的瓶頸部分絕對是益處多多的,因為它能明顯提升整體性能。

程式設計語言中的這種可擴充性使得工程師能夠靈活附加或定制工具,縮短開發周期。雖然像c、c++乃至java等主流第三代語言(3gl)都擁有該特性,但是這麼容易地使用c編寫擴充确實是 python 的優勢。此外,還有像pyrex這樣的工具,允許c和python混合程式設計,使編寫擴充更加輕而易舉,因為它會把所有的代碼都轉換成c語言代碼。

因為python的标準實作是使用c語言完成的(也就是cpython),是以要使用c和c++編寫python擴充。python的java實作被稱作jython,要使用java編寫其擴充。最後,還有ironpython,這是針對.net或mono平台的c#實作。你可以使用c#或者vb.net擴充ironpython。

在各種不同的系統上可以看到python的身影,這是由于在今天的計算機領域,python取得了持續快速的成長。因為python是用c寫的,又由于c的可移植性,使得python可以運作在任何帶有ansi c編譯器的平台上。盡管有一些針對不同平台開發的特有子產品,但是在任何一個平台上用python開發的通用軟體都可以稍事修改或者原封不動地在其他平台上運作。這種可移植性既适用于不同的架構,也适用于不同的作業系統。

python關鍵字少、結構簡單、文法清晰。這樣就使得學習者可以在更短的時間内輕松上手。對初學者而言,可能感覺比較新鮮的東西就是python的面向對象特點了。那些還未能全部精通oop(object oriented programming,面向對象的程式設計)的人對徑直使用python還是有所顧忌的,但是oop并非必須或者強制的。入門也是很簡單的,你可以先稍加涉獵,等到有所準備之後才開始使用。

python與其他語言顯著的差異是,它沒有其他語言通常用來通路變量、定義代碼塊和進行模式比對的指令式符号。通常這些符号包括:美元符号($)、分号(;)、波浪号(~)等。沒有這些分神的家夥,python代碼變得更加定義清晰和易于閱讀。讓很多程式員沮喪(或者欣慰)的是,不像其他語言,python沒有給你多少機會使你能夠寫出晦澀難懂的代碼,而是讓其他人很快就能了解你寫的代碼,反之亦然。如前所述,一門語言的可讀性讓它更易于學習。我們甚至敢冒昧的聲稱,即使對那些之前連一行python代碼都沒看過的人來說,那些代碼也是相當容易了解的。

源代碼維護是軟體開發生命周期的組成部分。隻要不被其他軟體取代或者被放棄使用,你的軟體通常會保持繼續的再開發。這通常可比一個程式員在一家公司的在職時間要長得多了。python項目的成功很大程度上要歸功于其源代碼的易于維護,當然這也要視代碼長度和複雜度而定。然而,得出這個結論并不難,因為python本身就是易于學習和閱讀的。python另外一個激動人心的優勢就是,當你在閱讀自己六個月之前寫的腳本程式的時候,不會把自己搞得一頭霧水,也不需要借助參考手冊才能讀懂自己的軟體。

沒有什麼能夠比允許程式員在錯誤發生的時候根據出錯條件提供處理機制更有效的了。針對錯誤,python提供了“安全合理”的退出機制,讓程式員能掌控局面。一旦你的python由于錯誤崩潰,解釋程式就會轉出一個“堆棧跟蹤”,那裡面有可用到的全部資訊,包括你程式崩潰的原因,以及是哪段代碼(檔案名、行數、行數調用等)出錯了。這些錯誤被稱為異常。如果在運作時發生這樣的錯誤,python 使你能夠監控這些錯誤并進行處理。

這些異常處理可以采取相應的措施,例如解決問題、重定向程式流、執行清除或維護步驟、正常關閉應用程式,亦或幹脆忽略掉。無論如何,這都可以有效地縮減開發周期中的調試環節。python的健壯性對軟體設計師和使用者而言都是大有助益的。一旦某些錯誤處理不當,python也還能提供一些資訊,作為某個錯誤結果而産生的堆棧追蹤不僅可以描述錯誤的類型和位置,還能指出代碼所在子產品。

我們之前已經提到了python是多麼的易學易讀。但是,你或許要問了,basic也是如此啊,python有什麼出類拔萃的呢?與那些封閉僵化的語言不同,python有許多面向其他系統的接口,它的功能足夠強大,本身也足夠強壯,是以完全可以使用python開發整個系統的原型。顯然,傳統的編譯型語言也能實作同樣的系統模組化,但是python工程方面的簡潔性讓我們可以在同樣的時間内遊刃有餘地完成相同的工作。此外,大家已經為python開發了為數衆多的擴充庫,是以無論你打算開發什麼樣的應用程式,都可能找到先行的前輩。你所要做的全部事情,就是來個“即插即用”(當然,也要自行配置一番)!隻要你能想得出來,python子產品和包就能幫你實作。python标準庫是很完備的,如果你在其中找不到所需的,那麼第三方子產品或包就會為你完成工作提供可能。

c或者c++最大的弊病在于記憶體管理是由開發者負責的。是以哪怕是對于一個很少通路、修改和管理記憶體的應用程式,程式員也必須在執行了基本任務之外履行這些職責。這些加在開發者身上的沒有必要的負擔和責任常常會分散精力。

在python中,由于記憶體管理是由python解釋器負責的,是以開發人員就可以從記憶體事務中解放出來,全神貫注于最直接的目标,僅僅緻力于開發計劃中首要的應用程式。這會使錯誤更少、程式更健壯、開發周期更短。

python是一種解釋型語言,這意味着開發過程中沒有了編譯這個環節。一般來說,由于不是以本地機器碼運作,純粹的解釋型語言通常比編譯型語言運作得慢。然而,類似于java,python實際上是位元組編譯的,其結果就是可以生成一種近似機器語言的中間形式。這不僅改善了python的性能,還同時使它保持了解釋型語言的優點。