首頁  >  文章  >  後端開發  >  Python簡介及入門指導

Python簡介及入門指導

巴扎黑
巴扎黑原創
2017-07-18 11:27:181635瀏覽

2017-07-15,這是我學習python的第一天。

  首先,python是一門當下很火熱的開發語言,它的創始人是Guido Van Rossum。就目前情況而言,python語言的熱度持續上升,已經超過C#排名第四。 Python崇尚優美,簡潔,清晰,是一種優秀且廣泛使用的語言。

一、Python是一門解釋型語言,邊運行變化解釋。

  先解釋一下編譯器,它是把原始程式的每一語句都編譯成機器語言,並保存成二進位文件,這樣運行起來的時候,機器直接根據編譯好的二進位來運行此文件,執行速度很快。而解釋器就不同了,解釋器是在程式執行時,才會一條條的解釋成機器語言給電腦執行。所以顯而易見,執行速度並沒有編譯後的檔案運行的快。這也是因為電腦不能直接辨識我們所寫的程式碼並且執行,只能認識電腦語言(即二進位檔案)。

  編譯型VS解釋型

#  編譯型



  優點:編譯器有預編譯的過程可以對程式碼進行最佳化。因為編譯只做一次,執行時不需要再編譯,所以編譯語言的執行效率很高。可以脫離語言環境直接運作。

  缺點:編譯器編譯好程式後,如果對程式碼進行修改就需要重新編譯。編譯時根據對應的運行環境產生機器碼,不同作業系統之間移植就會有問題,需要根據所需運行的作業系統的環境編譯成不同的可執行檔。


  

解釋型:



  優點:有良好的平台相容性,在任何環境中都能運行,前提是安裝了解釋器(虛擬機器)。因為是動態解釋,所以程式本身很靈活,修改程式碼的時候沒有顧慮直接修改直接運行,可以快速部署,程式更新不需要shut down維護。


  缺點:每次執行程式碼都需要一直伴隨著動態解釋的過程。效能上不如編譯型語言。

 

######為什麼是Python而不是其他語言? ############C 和Python、Java、C#等######    C語言: 程式碼編譯得到機器碼,機器碼在處理器上直接執行,每一指令控制CPU工作######其他語言: 程式碼編譯得到字節碼,虛擬機執行字節碼並轉換成機器碼再後在處理器上執行######Python 和C  Python這門語言是由 C開發而來######  對於使用:Python的類別庫齊全並且使用簡潔,如果要實現同樣的功能,Python 10行程式碼可以解決,C可能就需要100行甚至更多.###  對於速度:Python的運行速度相較與C,絕逼是慢了######Python 和Java、C#等######  對於使用:Linux原裝Python,其他語言沒有;以上幾門語言都有非常豐富的類別庫支援###  對於速度:Python在速度上可能稍顯遜色######所以,Python和其他語言沒有什麼本質區別,其他區別在於:擅長某領域、人才豐富、先入為主。 ######### ###############Python的類型############Cpython###    Python的官方版本,使用C語言實現,使用最為廣泛,CPython實作會將來源檔案(py檔案)轉換成字節碼檔案(pyc檔案),然後運行在Python虛擬機器上。 ######Jyhton###    Python的Java實現,Jython會將Python程式碼動態編譯成Java字節碼,然後在JVM上執行。 ######IronPython###    Python的C#實現,IronPython將Python程式碼編譯成C#字節碼,然後在CLR上執行。 (與Jython類似)######PyPy(特殊)###    Python實作的Python,將Python的字節碼字節碼再編譯成機器碼。 ######RubyPython、Brython ...###################

一、低階語言與高階語言
最初的電腦程式都是用0和1的序列表示的,程式設計師直接使用的是機器指令,無需翻譯,從紙帶打孔輸入即可執行得到結果。後來為了方便記憶,就將0、1序列表示的機器指令都用符號助記,這些與機器指令一一對應的助記符就成了彙編指令,從而誕生了組合語言。無論是機器指令或彙編指令都是面向機器的,統稱為低階語言。因為是針對特定機器的機器指令的助記符,所以彙編語言是無法獨立於機器(特定的CPU體系結構)的。但彙編語言也是要經過翻譯成機器指令才能執行的,所以也有將運行在一種機器上的彙編語言翻譯成運行在另一種機器上的機器指令的方法,那就是交叉彙編技術。
高階語言是從人類的邏輯思考角度出發的電腦語言,抽象程度大大提高,需要經過編譯成特定機器上的目標程式碼才能執行,一條高階語言的語句往往需要若干條機器指令來完成。高階語言獨立於機器的特性是靠編譯器為不同機器產生不同的目標碼(或機器指令)來實現的。那具體的說,要將高階語言編譯到什麼程度呢,這又跟編譯的技術有關了,既可以編譯成直接可執行的目標碼,也可以編譯成一種中間表示,然後拿到不同的機器和系統上去執行,這種情況通常需要支撐環境,例如解釋器或虛擬機的支持,Java程式編譯成bytecode,再由不同平台上的虛擬機器執行就是很好的例子。所以,說高階語言不依賴機器,是指在不同的機器或平台上高階語言的程式本身不變,而透過編譯器編譯得到的目標碼去適應不同的機器。從這個意義上來說,透過交叉彙編,一些彙編程式也可以獲得不同機器之間的可移植性,但這種途徑獲得的移植性遠遠不如高階語言來的方便性和實用性大。

二、編譯與解釋
編譯是將原始程式翻譯成可執行的目標程式碼,翻譯與執行是分開的;而解釋是對原始程式的翻譯與執行一次完成,不產生可儲存的目標程式碼。這只是表象,二者背後的最大差異是:對解釋執行而言,程式運行時的控制權在解釋器而不在使用者程式;對編譯執行而言,執行時的控制權在使用者程式。
解釋具有良好的動態特性和可移植性,例如在解釋執行時可以動態改變變數的類型、對程式進行修改以及在程式中插入良好的偵錯診斷資訊等,而將解釋器移植到不同的系統上,則程式不用改動就可以在移植了解釋器的系統上運作。同時解釋器也有很大的缺點,例如執行效率低,佔用空間大,因為不僅要給使用者程式分配空間,解釋器本身也佔用了寶貴的系統資源。

編譯器是把原始程式的每一語句都編譯成機器語言,並保存成二進位檔案,這樣運行時計算機可以直接以機器語言來運行此程式,速度很快; 而解釋器則是只在執行程式時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯後的程式運行的快的.

 

編譯型和解釋型我們先看看編譯型,其實它和組合語言是一樣的:也是有一個負責翻譯的程式來對我們的原始碼進行轉換,產生相對應的可執行程式碼。這個過程說得專業一點,就稱為編譯(Compile),而負責編譯的程式自然稱為編譯器(Compiler)。如果我們寫的程式碼都包含在一個原始檔中,那麼通常編譯之後就會直接產生一個可執行文件,我們就可以直接運行了。但對於一個比較複雜的項目,為了方便管理,我們通常把程式碼分散在各個原始檔中,作為不同的模組來組織。這時編譯各個檔案時就會產生目標檔案(Object   file)而不是前面說的執行檔。一般一個原始檔的編譯都會對應一個目標檔。這些目標檔案裡的內容基本上已經是可執行程式碼了,但由於只是整個專案的一部分,所以我們還不能直接運行。待所有的原始檔的編譯都大功告成,我們就可以最後把這些半成品的目標檔「打包」成一個可執行檔了,這個工作由另一個程式負責完成,由於此過程好像是把包含可執行程式碼的目標檔案連結組裝起來,所以又稱為連結(Link),而負責連結的程式就叫……就叫連結程式(Linker)。連結程式除了連結目標檔案外,可能還有各種資源,像是圖示檔案啊、聲音檔案啊什麼的,還要負責去除目標檔案之間的冗餘重複程式碼,等等,所以…也是挺累的。連結完成之後,一般就可以得到我們想要的可執行檔了。 
上面我們大概地介紹了編譯型語言的特點,現在再看看解釋型。噢,從字面上看,「編譯」和「解釋」的確都有「翻譯」的意思,它們的差別則在於翻譯的時機安排不大一樣。打個比方:假如你打算閱讀一本外文書,而你不知道這門外語,那麼你可以找一名翻譯,給他足夠的時間讓他從頭到尾把整本書翻譯好,然後把書的母語版交給你閱讀;或者,你也立刻讓這名翻譯輔助你閱讀,請他一句一句給你翻譯,如果你想往回看某個章節,他也得重新給你翻譯。
兩種方式,前者就相當於我們剛才所說的編譯型:一次把所有的程式碼轉換成機器語言,然後寫成可執行檔;而後者就相當於我們要說的解釋型:在程式運行的前一刻,還只有原始程式而沒有可執行程式;而程式每執行到原始程式的某一條指令,則會有一個稱為解釋程式的外殼程式將原始程式碼轉換成二進位程式碼以供執行,總言之,就是不斷地解釋、執行、解釋、執行……所以,解釋型程式是離不開解釋程序的。像早期的BASIC就是一門經典的解釋型語言,要執行BASIC程序,就得進入BASIC環境,然後才能載入程式原始檔、執行。在解釋型程式中,由於程式總是以原始碼的形式出現,因此只要有相應的解釋器,移植幾乎不成問題。編譯型程式雖然原始碼也可以移植,但前提是必須針對不同的系統分別進行編譯,對於複雜的工程來說,的確是一件不小的時間消耗,況且很可能一些細節的地方還是要修改源代碼。而且,解釋型程式省卻了編譯的步驟,修改調試也非常方便,編輯完畢之後即可立即運行,不必像編譯型程式一樣每次進行小小改動都要耐心等待漫長的Compiling…Linking…這樣的編譯連結過程。不過凡事有利有弊,由於解釋型程式是將編譯的過程放到執行過程中,這就決定了解釋型程式註定要比編譯型慢上一大截,像幾百倍的速度差距也是不足為奇的。 
編譯型與解譯型,兩者各有優缺點。前者由於程式執行速度快,同等條件下對系統需求較低,因此像開發作業系統、大型應用程式、資料庫系統等時都採用它,像C/C++、Pascal/Object   Pascal(Delphi)、VB等基本都可視為編譯語言,而一些網頁腳本、伺服器腳本及輔助開發介面這樣的對速度要求不高、對不同系統平台間的兼容性有一定要求的程式則通常使用解釋性語言,如Java、JavaScript 、VBScript、Perl、Python等等。 
#但既然編譯型與解釋型各有優缺點又相互對立,所以一批新興的語言都有把兩者折衷起來的趨勢,例如Java語言雖然比較接近解釋型語言的特徵,但在執行之前已經預先進行一次預先編譯,產生的程式碼是介於機器碼和Java原始碼之間的中介程式碼,執行的時候則由JVM(Java的虛擬機器平台,可視為解釋器)解釋執行。它既保留了原始程式碼的高抽象、可移植的特點,又已經完成了原始程式碼的大部分預編譯工作,所以執行起來比「純解釋型」程式要快許多。而像VB6(或以前版本)、C#這樣的語言,雖然表面上看生成的是.exe可執行程序文件,但VB6編譯之後實際生成的也是一種中介碼,只不過編譯器在前面安插了一段自動呼叫某個外部解釋器的程式碼(該解釋程式獨立於使用者編寫的程序,存放於系統的某個DLL檔案中,所有以VB6編譯產生的可執行程式都要用到它),以解釋執行實際的程序體。 C#(以及其它.net的語言編譯器)則是產生.net目標程式碼,實際執行時則由.net解釋系統(就像JVM一樣,也是一個虛擬機器平台)進行執行。當然.net目標程式碼已經相當“低級”,比較接近機器語言了,所以仍將其視為編譯語言,而且其可移植程度也沒有Java號稱的這麼強大,Java號稱是“一次編譯,到處執行”,而.net則是「一次編碼,到處編譯」。呵呵,當然這些都是題外話了。總之,隨著設計技術與硬體的不斷發展,編譯型與詮釋型兩種方式的界線不斷變得模糊。

動態語言與靜態語言 通常我們所說的動態語言、靜態語言是指動態型別語言和靜態型別語言。

(1)動態類型語言:動態類型語言是指在運行期間才去做資料類型檢查的語言,也就是說,在用動態類型的語言程式設計時,永遠也不用給任何變數指定資料類型,語言會在你第一次賦值給變數時,在內部將資料類型記錄下來。 Python和Ruby就是一種典型的動態型別語言,其他的各種腳本語言如VBScript也多少屬於動態型別語言。

(2)靜態型別語言:靜態型別語言與動態型別語言剛好相反,它的資料型別是在編譯其間檢查的,也就是說在寫程式時要宣告所有變數的資料型別,C/C++是靜態型別語言的典型代表,其他的靜態型別語言還有C#、JAVA等。

 

強型別定義語言與弱型別定義語言

(1)強型別類型定義語言:強制資料類型定義的語言。也就是說,一旦變數被指定了某個資料類型,如果不經過強制轉換,那麼它就永遠是這個資料類型了。舉個例子:如果你定義了一個整數變數a,那麼程式根本不可能將a當作字串類型處理。強型別定義語言是型別安全的語言。

(2)弱型別定義語言:資料型別可以被忽略的語言。它與強型別定義語言相反, 一個變數可以賦能不同資料型別的值。

強型別定義語言在速度上可能略遜色於弱型別定義語言,但是強型別定義語言帶來的嚴謹性能夠有效的避免許多錯誤。另外,「這門語言是不是動態語言」與「這門語言是否類型安全」之間是完全沒有關聯的! 例如:Python是動態語言,是強型別定義語言(型別安全的語言); VBScript是動態語言,是弱型別定義語言(型別不安全的語言); JAVA是靜態語言,是強型別定義語言(型別的語言)。

 

透過上述這些介紹,我們可以得出,python是一門動態解釋性的強型別定義語言。那這些基因讓成就了Python的哪些優缺點呢?我們繼續往下看。

  Python的優缺點

  先看優點

  1. #Python的定位是“優雅”、“明確”、“簡單”,所以Python程式看起來總是簡單易懂,初學者學Python,不僅入門容易,而且將來深入下去,可以寫那些非常非常複雜的程式。

開發效率非常高,Python有非常強大的第三方函式庫,基本上你想透過電腦實現任何功能,Python官方庫裡都有相應的模組進行支持,直接下載呼叫後,在基礎庫的基礎上再進行開發,大幅降低開發週期,避免重複造輪子。

  1. 高階語言————當你用Python語言寫程式的時候,你無需考慮諸如如何管理你的程式所使用的記憶體一類的底層細節

  2. 可移植性————由於它的開源本質,Python已經被移植在許多平台上(經過改變使它能夠工作在不同平台上)。如果你小心地避免使用依賴系統的特性,那麼你的所有Python程式無需修改就幾乎可以在市場上所有的系統平台上運行

  3. 可擴展性————如果你需要你的一段關鍵程式碼運行得更快或希望某些演算法不公開,你可以把你的部分程式用C或C++編寫,然後在你的Python程式中使用它們。

可嵌入性————你可以把Python嵌入你的C/C++程序,從而向你的程式使用者提供腳本功能。

#########  再看缺點:##################速度慢,Python 的運行速度相比C語言確實慢很多,跟JAVA相比也要慢一些,因此這也是很多所謂的大牛不屑於使用Python的主要原因,但其實這裡所指的運行速度慢在大多數情況下用戶是無法直接感知到的,必須藉助測試工具才能體現出來,例如你用C運一個程式花了0.01s,用Python是0.1s,這樣C語言直接比Python快了10倍,算是非常誇張了,但是你是無法直接通過肉眼感知的,因為一個正常人所能感知的時間最小單位是0.15-0.4s左右,哈哈。其實在大多數情況下Python已經完全可以滿足你對程式速度的要求,除非你要寫對速度要求極高的搜尋引擎等,這種情況下,當然還是建議你用C去實現的。 ##################程式碼不能加密,因為PYTHON是解釋性語言,它的原始碼都是以名文形式存放的,不過我不認為這算是缺點,如果你的專案要求原始碼必須是加密的,那你一開始就不應該用Python來去實作。 ##################線程不能利用多CPU問題,這是Python被人詬病最多的一個缺點,GIL即全局解釋器鎖(Global Interpreter Lock),是計算機程式設計語言解釋器用於同步執行緒的工具,使得任何時刻只有一個執行緒在執行,Python的執行緒是作業系統的原生執行緒。在Linux上為pthread,在Windows上為Win thread,完全由作業系統調度執行緒的執行。一個python解釋器進程內有一條主線程,以及多條用戶程式的執行線程。即使在多核心CPU平台上,由於GIL的存在,所以禁止多執行緒的並行執行。關於這個問題的折衷解決方法,我們在以後線程和進程章節裡再進行詳細探討。 ################## ######

當然,Python還有一些其它的小缺點,在這就不一一列舉了,我想說的是,任何一門語言都不是完美的,都有擅長和不擅長做的事情,建議各位不要拿一個語言的劣勢去跟另一個語言的優勢來去比較,語言只是一個工具,是實現程序設計師思想的工具,就像我們之前中學學幾何時,有的時候需要要圓規,有的時候需要用三角尺一樣,拿對應的工具去做它最擅長的事才是正確的選擇。之前很多人問我Shell和Python到底哪個好?我回答說Shell是個腳本語言,但Python不只是個腳本語言,能做的事情更多,然後又有鑽牛角尖的人說完全沒必要學Python, Python能做的事情Shell都可以做,只要你夠牛B,然後又舉了用Shell可以寫俄羅斯方塊這樣的遊戲,對此我能說表達只能是,不要跟SB理論,SB會把你拉到跟他一樣的高度,然後用充分的經驗把你打倒。

 

以上是Python簡介及入門指導的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn