一、Python介紹
Python的創(chuàng)始人為吉多·范羅蘇姆(Guido van Rossum)。1989年的圣誕節(jié)期間,吉多·范羅蘇姆為了在阿姆斯特丹打發(fā)時(shí)間,決心開發(fā)一個(gè)新的腳本解釋程序,作為ABC語言的一種繼承。
最新的TIOBE排行榜,Python趕超PHP占據(jù)第五, Python崇尚優(yōu)美、清晰、簡單,是一個(gè)優(yōu)秀并廣泛使用的語言。
由上圖可見,Python整體呈上升趨勢,反映出Python應(yīng)用越來越廣泛并且也逐漸得到業(yè)內(nèi)的認(rèn)可!!!
Python可以應(yīng)用于眾多領(lǐng)域,如:數(shù)據(jù)分析、組件集成、網(wǎng)絡(luò)服務(wù)、圖像處理、數(shù)值計(jì)算和科學(xué)計(jì)算等眾多領(lǐng)域。目前業(yè)內(nèi)幾乎所有大中型互聯(lián)網(wǎng)企業(yè)都在使用Python,如:Youtube、Dropbox、BT、Quora(中國知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、騰訊、汽車之家、美團(tuán)等。
目前Python主要應(yīng)用領(lǐng)域:
- 云計(jì)算: 云計(jì)算最火的語言, 典型應(yīng)用OpenStack
- WEB開發(fā): 眾多優(yōu)秀的WEB框架,眾多大型網(wǎng)站均為Python開發(fā),Youtube, Dropbox, 豆瓣等等。典型WEB框架Django。
- 科學(xué)運(yùn)算、人工智能:典型庫NumPy, SciPy, Matplotlib, Enthought librarys,pandas
- 系統(tǒng)運(yùn)維:運(yùn)維人員必備語言
- 金融:量化交易,金融分析,在金融工程領(lǐng)域,Python不但在用,且用的最多,而且重要性逐年提高。原因:作為動(dòng)態(tài)語言的Python,語言結(jié)構(gòu)清晰簡單,庫豐富,成熟穩(wěn)定,科學(xué)計(jì)算和統(tǒng)計(jì)分析都很牛逼,生產(chǎn)效率遠(yuǎn)遠(yuǎn)高于c,c++,java,尤其擅長策略回測
- 圖形GUI: PyQT, WxPython,TkInter
Python在一些公司的應(yīng)用:
- 谷歌:Google App Engine 、code.google.com 、Google earth 、谷歌爬蟲、Google廣告等項(xiàng)目都在大量使用Python開發(fā)
- **CIA: **美國中情局網(wǎng)站就是用Python開發(fā)的
- **NASA: **美國航天局(NASA)大量使用Python進(jìn)行數(shù)據(jù)分析和運(yùn)算
- YouTube:世界上最大的視頻網(wǎng)站YouTube就是用Python開發(fā)的
- Dropbox:美國最大的在線云存儲(chǔ)網(wǎng)站,全部用Python實(shí)現(xiàn),每天網(wǎng)站處理10億個(gè)文件的上傳和下載
- Instagram:美國最大的圖片分享社交網(wǎng)站,每天超過3千萬張照片被分享,全部用Python開發(fā)
- Facebook:大量的基礎(chǔ)庫均通過Python實(shí)現(xiàn)的
- **Redhat: **世界上最流行的Linux發(fā)行版本中的yum包管理工具就是用Python開發(fā)的
- **豆瓣: **公司幾乎所有的業(yè)務(wù)均是通過Python開發(fā)的
- **知乎: **國內(nèi)最大的問答社區(qū),通過Python開發(fā)(國外Quora)
- 春雨醫(yī)生:國內(nèi)知名的在線醫(yī)療網(wǎng)站是用Python開發(fā)的
- 除上面之外,還有搜狐、金山、騰訊、盛大、網(wǎng)易、百度、阿里、淘寶 、土豆、新浪、果殼等公司都在使用Python完成各種各樣的任務(wù)。
Python是一門什么樣的語言?
編程語言主要從以下幾個(gè)角度為進(jìn)行分類,編譯型和解釋型、靜態(tài)語言和動(dòng)態(tài)語言、強(qiáng)類型定義語言和弱類型定義語言,每個(gè)分類代表什么意思呢,我們一起來看一下。
編譯和解釋的區(qū)別是什么?
編譯器是把源程序的每一條語句都編譯成機(jī)器語言,并保存成二進(jìn)制文件,這樣運(yùn)行時(shí)計(jì)算機(jī)可以直接以機(jī)器語言來運(yùn)行此程序,速度很快;
而解釋器則是只在執(zhí)行程序時(shí),才一條一條的解釋成機(jī)器語言給計(jì)算機(jī)來執(zhí)行,所以運(yùn)行速度是不如編譯后的程序運(yùn)行的快的.
這是因?yàn)橛?jì)算機(jī)不能直接認(rèn)識(shí)并執(zhí)行我們寫的語句,它只能認(rèn)識(shí)機(jī)器語言(是二進(jìn)制的形式)
一、低級(jí)語言與高級(jí)語言
- 最初的計(jì)算機(jī)程序都是用0和1的序列表示的,程序員直接使用的是機(jī)器指令,無需翻譯,從紙帶打孔輸入即可執(zhí)行得到結(jié)果。后來為了方便記憶,就將用0、1序列表示的機(jī)器指令都用符號(hào)助記,這些與機(jī)器指令一一對(duì)應(yīng)的助記符就成了匯編指令,從而誕生了匯編語言。無論是機(jī)器指令還是匯編指令都是面向機(jī)器的,統(tǒng)稱為低級(jí)語言。因?yàn)槭轻槍?duì)特定機(jī)器的機(jī)器指令的助記符,所以匯編語言是無法獨(dú)立于機(jī)器(特定的CPU體系結(jié)構(gòu))的。
- 但匯編語言也是要經(jīng)過翻譯成機(jī)器指令才能執(zhí)行的,所以也有將運(yùn)行在一種機(jī)器上的匯編語言翻譯成運(yùn)行在另一種機(jī)器上的機(jī)器指令的方法,那就是交叉匯編技術(shù)。
- 高級(jí)語言是從人類的邏輯思維角度出發(fā)的計(jì)算機(jī)語言,抽象程度大大提高,需要經(jīng)過編譯成特定機(jī)器上的目標(biāo)代碼才能執(zhí)行,一條高級(jí)語言的語句往往需要若干條機(jī)器指令來完成。高級(jí)語言獨(dú)立于機(jī)器的特性是靠編譯器為不同機(jī)器生成不同的目標(biāo)代碼(或機(jī)器指令)來實(shí)現(xiàn)的。那具體的說,要將高級(jí)語言編譯到什么程度呢,這又跟編譯的技術(shù)有關(guān)了,既可以編譯成直接可執(zhí)行的目標(biāo)代碼,也可以編譯成一種中間表示,然后拿到不同的機(jī)器和系統(tǒng)上去執(zhí)行,這種情況通常又需要支撐環(huán)境,比如解釋器或虛擬機(jī)的支持,Java程序編譯成bytecode,再由不同平臺(tái)上的虛擬機(jī)執(zhí)行就是很好的例子。
- 所以,說高級(jí)語言不依賴于機(jī)器,是指在不同的機(jī)器或平臺(tái)上高級(jí)語言的程序本身不變,而通過編譯器編譯得到的目標(biāo)代碼去適應(yīng)不同的機(jī)器。從這個(gè)意義上來說,通過交叉匯編,一些匯編程序也可以獲得不同機(jī)器之間的可移植性,但這種途徑獲得的移植性遠(yuǎn)遠(yuǎn)不如高級(jí)語言來的方便和實(shí)用性大。
二、編譯與解釋
- 編譯是將源程序翻譯成可執(zhí)行的目標(biāo)代碼,翻譯與執(zhí)行是分開的;而解釋是對(duì)源程序的翻譯與執(zhí)行一次性完成,不生成可存儲(chǔ)的目標(biāo)代碼。這只是表象,二者背后的最大區(qū)別是:對(duì)解釋執(zhí)行而言,程序運(yùn)行時(shí)的控制權(quán)在解釋器而不在用戶程序;對(duì)編譯執(zhí)行而言,運(yùn)行時(shí)的控制權(quán)在用戶程序。
- 解釋具有良好的動(dòng)態(tài)特性和可移植性,比如在解釋執(zhí)行時(shí)可以動(dòng)態(tài)改變變量的類型、對(duì)程序進(jìn)行修改以及在程序中插入良好的調(diào)試診斷信息等,而將解釋器移植到不同的系統(tǒng)上,則程序不用改動(dòng)就可以在移植了解釋器的系統(tǒng)上運(yùn)行。同時(shí)解釋器也有很大的缺點(diǎn),比如執(zhí)行效率低,占用空間大,因?yàn)椴粌H要給用戶程序分配空間,解釋器本身也占用了寶貴的系統(tǒng)資源。
- 編譯器是把源程序的每一條語句都編譯成機(jī)器語言,并保存成二進(jìn)制文件,這樣運(yùn)行時(shí)計(jì)算機(jī)可以直接以機(jī)器語言來運(yùn)行此程序,速度很快;
- 而解釋器則是只在執(zhí)行程序時(shí),才一條一條的解釋成機(jī)器語言給計(jì)算機(jī)來執(zhí)行,所以運(yùn)行速度是不如編譯后的程序運(yùn)行的快的.
編譯型和解釋型
- 我們先看看編譯型,其實(shí)它和匯編語言是一樣的:也是有一個(gè)負(fù)責(zé)翻譯的程序來對(duì)我們的源代碼進(jìn)行轉(zhuǎn)換,生成相對(duì)應(yīng)的可執(zhí)行代碼。這個(gè)過程說得專業(yè)一點(diǎn),就稱為編譯(Compile),而負(fù)責(zé)編譯的程序自然就稱為編譯器(Compiler)。
- 如果我們寫的程序代碼都包含在一個(gè)源文件中,那么通常編譯之后就會(huì)直接生成一個(gè)可執(zhí)行文件,我們就可以直接運(yùn)行了。但對(duì)于一個(gè)比較復(fù)雜的項(xiàng)目,為了方便管理,我們通常把代碼分散在各個(gè)源文件中,作為不同的模塊來組織。這時(shí)編譯各個(gè)文件時(shí)就會(huì)生成目標(biāo)文件(Object file)而不是前面說的可執(zhí)行文件。一般一個(gè)源文件的編譯都會(huì)對(duì)應(yīng)一個(gè)目標(biāo)文件。
- 這些目標(biāo)文件里的內(nèi)容基本上已經(jīng)是可執(zhí)行代碼了,但由于只是整個(gè)項(xiàng)目的一部分,所以我們還不能直接運(yùn)行。待所有的源文件的編譯都大功告成,我們就可以最后把這些半成品的目標(biāo)文件“打包”成一個(gè)可執(zhí)行文件了,這個(gè)工作由另一個(gè)程序負(fù)責(zé)完成,由于此過程好像是把包含可執(zhí)行代碼的目標(biāo)文件連接裝配起來,所以又稱為鏈接(Link),而負(fù)責(zé)鏈接的程序就叫……就叫鏈接程序(Linker)。鏈接程序除了鏈接目標(biāo)文件外,可能還有各種資源,像圖標(biāo)文件啊、聲音文件啊什么的,還要負(fù)責(zé)去除目標(biāo)文件之間的冗余重復(fù)代碼,等等,所以……也是挺累的。鏈接完成之后,一般就可以得到我們想要的可執(zhí)行文件了。
- 上面我們大概地介紹了編譯型語言的特點(diǎn),現(xiàn)在再看看解釋型。噢,從字面上看,“編譯”和“解釋”的確都有“翻譯”的意思,它們的區(qū)別則在于翻譯的時(shí)機(jī)安排不大一樣。打個(gè)比方:假如你打算閱讀一本外文書,而你不知道這門外語,那么你可以找一名翻譯,給他足夠的時(shí)間讓他從頭到尾把整本書翻譯好,然后把書的母語版交給你閱讀;或者,你也立刻讓這名翻譯輔助你閱讀,讓他一句一句給你翻譯,如果你想往回看某個(gè)章節(jié),他也得重新給你翻譯。
- 兩種方式,前者就相當(dāng)于我們剛才所說的編譯型:一次把所有的代碼轉(zhuǎn)換成機(jī)器語言,然后寫成可執(zhí)行文件;而后者就相當(dāng)于我們要說的解釋型:在程序運(yùn)行的前一刻,還只有源程序而沒有可執(zhí)行程序;而程序每執(zhí)行到源程序的某一條指令,則會(huì)有一個(gè)稱之為解釋程序的外殼程序?qū)⒃创a轉(zhuǎn)換成二進(jìn)制代碼以供執(zhí)行,總言之,就是不斷地解釋、執(zhí)行、解釋、執(zhí)行……所以,解釋型程序是離不開解釋程序的。像早期的BASIC就是一門經(jīng)典的解釋型語言,要執(zhí)行BASIC程序,就得進(jìn)入BASIC環(huán)境,然后才能加載程序源文件、運(yùn)行。解釋型程序中,由于程序總是以源代碼的形式出現(xiàn),因此只要有相應(yīng)的解釋器,移植幾乎不成問題。
- 編譯型程序雖然源代碼也可以移植,但前提是必須針對(duì)不同的系統(tǒng)分別進(jìn)行編譯,對(duì)于復(fù)雜的工程來說,的確是一件不小的時(shí)間消耗,況且很可能一些細(xì)節(jié)的地方還是要修改源代碼。而且,解釋型程序省卻了編譯的步驟,修改調(diào)試也非常方便,編輯完畢之后即可立即運(yùn)行,不必像編譯型程序一樣每次進(jìn)行小小改動(dòng)都要耐心等待漫長的Compiling…Linking…這樣的編譯鏈接過程。不過凡事有利有弊,由于解釋型程序是將編譯的過程放到執(zhí)行過程中,這就決定了解釋型程序注定要比編譯型慢上一大截,像幾百倍的速度差距也是不足為奇的。
- 編譯型與解釋型,兩者各有利弊。前者由于程序執(zhí)行速度快,同等條件下對(duì)系統(tǒng)要求較低,因此像開發(fā)操作系統(tǒng)、大型應(yīng)用程序、數(shù)據(jù)庫系統(tǒng)等時(shí)都采用它,像C/C++、Pascal/Object Pascal(Delphi)、VB等基本都可視為編譯語言,而一些網(wǎng)頁腳本、服務(wù)器腳本及輔助開發(fā)接口這樣的對(duì)速度要求不高、對(duì)不同系統(tǒng)平臺(tái)間的兼容性有一定要求的程序則通常使用解釋性語言,如Java、JavaScript、VBScript、Perl、Python等等。
- 但既然編譯型與解釋型各有優(yōu)缺點(diǎn)又相互對(duì)立,所以一批新興的語言都有把兩者折衷起來的趨勢,例如Java語言雖然比較接近解釋型語言的特征,但在執(zhí)行之前已經(jīng)預(yù)先進(jìn)行一次預(yù)編譯,生成的代碼是介于機(jī)器碼和Java源代碼之間的中介代碼,運(yùn)行的時(shí)候則由JVM(Java的虛擬機(jī)平臺(tái),可視為解釋器)解釋執(zhí)行。
- 它既保留了源代碼的高抽象、可移植的特點(diǎn),又已經(jīng)完成了對(duì)源代碼的大部分預(yù)編譯工作,所以執(zhí)行起來比“純解釋型”程序要快許多。而像VB6(或者以前版本)、C#這樣的語言,雖然表面上看生成的是.exe可執(zhí)行程序文件,但VB6編譯之后實(shí)際生成的也是一種中介碼,只不過編譯器在前面安插了一段自動(dòng)調(diào)用某個(gè)外部解釋器的代碼(該解釋程序獨(dú)立于用戶編寫的程序,存放于系統(tǒng)的某個(gè)DLL文件中,所有以VB6編譯生成的可執(zhí)行程序都要用到它),以解釋執(zhí)行實(shí)際的程序體。C#(以及其它.net的語言編譯器)則是生成.net目標(biāo)代碼,實(shí)際執(zhí)行時(shí)則由.net解釋系統(tǒng)(就像JVM一樣,也是一個(gè)虛擬機(jī)平臺(tái))進(jìn)行執(zhí)行。當(dāng)然.net目標(biāo)代碼已經(jīng)相當(dāng)“低級(jí)”,比較接近機(jī)器語言了,所以仍將其視為編譯語言,而且其可移植程度也沒有Java號(hào)稱的這么強(qiáng)大,Java號(hào)稱是“一次編譯,到處執(zhí)行”,而.net則是“一次編碼,到處編譯”。呵呵,當(dāng)然這些都是題外話了。
- 總之,隨著設(shè)計(jì)技術(shù)與硬件的不斷發(fā)展,編譯型與解釋型兩種方式的界限正在不斷變得模糊。
動(dòng)態(tài)語言和靜態(tài)語言
通常我們所說的動(dòng)態(tài)語言、靜態(tài)語言是指動(dòng)態(tài)類型語言和靜態(tài)類型語言。
1.動(dòng)態(tài)類型語言:動(dòng)態(tài)類型語言是指在運(yùn)行期間才去做數(shù)據(jù)類型檢查的語言,也就是說,在用動(dòng)態(tài)類型的語言編程時(shí),永遠(yuǎn)也不用給任何變量指定數(shù)據(jù)類型,該語言會(huì)在你第一次賦值給變量時(shí),在內(nèi)部將數(shù)據(jù)類型記錄下來。Python和Ruby就是一種典型的動(dòng)態(tài)類型語言,其他的各種腳本語言如VBScript也多少屬于動(dòng)態(tài)類型語言。
2.靜態(tài)類型語言:靜態(tài)類型語言與動(dòng)態(tài)類型語言剛好相反,它的數(shù)據(jù)類型是在編譯其間檢查的,也就是說在寫程序時(shí)要聲明所有變量的數(shù)據(jù)類型,C/C++是靜態(tài)類型語言的典型代表,其他的靜態(tài)類型語言還有C#、JAVA等。
強(qiáng)類型定義語言和弱類型定義語言
強(qiáng)類型定義語言:強(qiáng)制數(shù)據(jù)類型定義的語言。也就是說,一旦一個(gè)變量被指定了某個(gè)數(shù)據(jù)類型,如果不經(jīng)過強(qiáng)制轉(zhuǎn)換,那么它就永遠(yuǎn)是這個(gè)數(shù)據(jù)類型了。舉個(gè)例子:如果你定義了一個(gè)整型變量a,那么程序根本不可能將a當(dāng)作字符串類型處理。強(qiáng)類型定義語言是類型安全的語言。
弱類型定義語言:數(shù)據(jù)類型可以被忽略的語言。它與強(qiáng)類型定義語言相反, 一個(gè)變量可以賦不同數(shù)據(jù)類型的值。
強(qiáng)類型定義語言在速度上可能略遜色于弱類型定義語言,但是強(qiáng)類型定義語言帶來的嚴(yán)謹(jǐn)性能夠有效的避免許多錯(cuò)誤。另外,“這門語言是不是動(dòng)態(tài)語言”與“這門語言是否類型安全”之間是完全沒有聯(lián)系的!
例如:Python是動(dòng)態(tài)語言,是強(qiáng)類型定義語言(類型安全的語言); VBScript是動(dòng)態(tài)語言,是弱類型定義語言(類型不安全的語言); JAVA是靜態(tài)語言,是強(qiáng)類型定義語言(類型安全的語言)。
通過上面這些介紹,我們可以得出,python是一門動(dòng)態(tài)解釋性的強(qiáng)類型定義語言。那這些基因使成就了Python的哪些優(yōu)缺點(diǎn)呢?我們繼續(xù)往下看。
Python的優(yōu)缺點(diǎn)
先看優(yōu)點(diǎn):
1.Python的定位是“優(yōu)雅”、“明確”、“簡單”,所以Python程序看上去總是簡單易懂,初學(xué)者學(xué)Python,不但入門容易,而且將來深入下去,可以編寫那些非常非常復(fù)雜的程序。
2.開發(fā)效率非常高,Python有非常強(qiáng)大的第三方庫,基本上你想通過計(jì)算機(jī)實(shí)現(xiàn)任何功能,Python官方庫里都有相應(yīng)的模塊進(jìn)行支持,直接下載調(diào)用后,在基礎(chǔ)庫的基礎(chǔ)上再進(jìn)行開發(fā),大大降低開發(fā)周期,避免重復(fù)造輪子。
3高級(jí)語言————當(dāng)你用Python語言編寫程序的時(shí)候,你無需考慮諸如如何管理你的程序使用的內(nèi)存一類的底層細(xì)節(jié)
4.可移植性————由于它的開源本質(zhì),Python已經(jīng)被移植在許多平臺(tái)上(經(jīng)過改動(dòng)使它能夠工 作在不同平臺(tái)上)。如果你小心地避免使用依賴于系統(tǒng)的特性,那么你的所有Python程序無需修改就幾乎可以在市場上所有的系統(tǒng)平臺(tái)上運(yùn)行
5.可擴(kuò)展性————如果你需要你的一段關(guān)鍵代碼運(yùn)行得更快或者希望某些算法不公開,你可以把你的部分程序用C或C++編寫,然后在你的Python程序中使用它們。
6.可嵌入性————你可以把Python嵌入你的C/C++程序,從而向你的程序用戶提供腳本功能。
再看缺點(diǎn):
1.速度慢,Python 的運(yùn)行速度相比C語言確實(shí)慢很多,跟JAVA相比也要慢一些,因此這也是很多所謂的大牛不屑于使用Python的主要原因,但其實(shí)這里所指的運(yùn)行速度慢在大多數(shù)情況下用戶是無法直接感知到的,必須借助測試工具才能體現(xiàn)出來,比如你用C運(yùn)一個(gè)程序花了0.1s,用Python是0.01s,這樣C語言直接比Python快了10倍,算是非常夸張了,但是你是無法直接通過肉眼感知的,因?yàn)橐粋€(gè)正常人所能感知的時(shí)間最小單位是0.15-0.4s左右,哈哈。其實(shí)在大多數(shù)情況下Python已經(jīng)完全可以滿足你對(duì)程序速度的要求,除非你要寫對(duì)速度要求極高的搜索引擎等,這種情況下,當(dāng)然還是建議你用C去實(shí)現(xiàn)的。
2.代碼不能加密,因?yàn)镻ython是解釋性語言,它的源碼都是以名文形式存放的,不過我不認(rèn)為這算是一個(gè)缺點(diǎn),如果你的項(xiàng)目要求源代碼必須是加密的,那你一開始就不應(yīng)該用Python來去實(shí)現(xiàn)。
3.線程不能利用多CPU問題,這是Python被人詬病最多的一個(gè)缺點(diǎn),GIL即全局解釋器鎖(Global Interpreter Lock),是計(jì)算機(jī)程序設(shè)計(jì)語言解釋器用于同步線程的工具,使得任何時(shí)刻僅有一個(gè)線程在執(zhí)行,Python的線程是操作系統(tǒng)的原生線程。在Linux上為pthread,在Windows上為Win thread,完全由操作系統(tǒng)調(diào)度線程的執(zhí)行。一個(gè)Python解釋器進(jìn)程內(nèi)有一條主線程,以及多條用戶程序的執(zhí)行線程。即使在多核CPU平臺(tái)上,由于GIL的存在,所以禁止多線程的并行執(zhí)行。關(guān)于這個(gè)問題的折衷解決方法,我們?cè)谝院缶€程和進(jìn)程章節(jié)里再進(jìn)行詳細(xì)探討。
當(dāng)然,Python還有一些其它的小缺點(diǎn),在這就不一一列舉了,我想說的是,任何一門語言都不是完美的,都有擅長和不擅長做的事情,建議各位不要拿一個(gè)語言的劣勢去跟另一個(gè)語言的優(yōu)勢來去比較,語言只是一個(gè)工具,是實(shí)現(xiàn)程序設(shè)計(jì)師思想的工具,就像我們之前中學(xué)學(xué)幾何時(shí),有的時(shí)候需要要圓規(guī),有的時(shí)候需要用三角尺一樣,拿相應(yīng)的工具去做它最擅長的事才是正確的選擇。之前很多人問我Shell和Python到底哪個(gè)好?我回答說Shell是個(gè)腳本語言,但Python不只是個(gè)腳本語言,能做的事情更多,然后又有鉆牛角尖的人說完全沒必要學(xué)Python, Python能做的事情Shell都可以做,只要你足夠牛B,然后又舉了用Shell可以寫俄羅斯方塊這樣的游戲,對(duì)此我能說表達(dá)只能是,不要跟SB理論,SB會(huì)把你拉到跟他一樣的高度,然后用充分的經(jīng)驗(yàn)把你打倒。
Python解釋器
當(dāng)我們編寫Python代碼時(shí),我們得到的是一個(gè)包含Python代碼的以.py為擴(kuò)展名的文本文件。要運(yùn)行代碼,就需要Python解釋器去執(zhí)行.py文件。
由于整個(gè)Python語言從規(guī)范到解釋器都是開源的,所以理論上,只要水平夠高,任何人都可以編寫Python解釋器來執(zhí)Python代碼(當(dāng)然難度很大)。事實(shí)上,確實(shí)存在多種Python解釋器。
CPython
當(dāng)我們從Python官方網(wǎng)站下載并安裝好Python 2.7后,我們就直接獲得了一個(gè)官方版本的解釋器:CPython。這個(gè)解釋器是用C語言開發(fā)的,所以叫CPython。在命令行下運(yùn)行python就是啟動(dòng)CPython解釋器。
CPython是使用最廣的Python解釋器。教程的所有代碼也都在CPython下執(zhí)行。
IPython
IPython是基于CPython之上的一個(gè)交互式解釋器,也就是說,IPython只是在交互方式上有所增強(qiáng),但是執(zhí)行Python代碼的功能和CPython是完全一樣的。好比很多國產(chǎn)瀏覽器雖然外觀不同,但內(nèi)核其實(shí)都是調(diào)用了IE。
CPython用>>>作為提示符,而IPython用In [序號(hào)]:作為提示符。
PyPy
PyPy是另一個(gè)Python解釋器,它的目標(biāo)是執(zhí)行速度。PyPy采用JIT技術(shù),對(duì)Python代碼進(jìn)行動(dòng)態(tài)編譯(注意不是解釋),所以可以顯著提高Python代碼的執(zhí)行速度。
絕大部分Python代碼都可以在PyPy下運(yùn)行,但是PyPy和CPython有一些是不同的,這就導(dǎo)致相同的Python代碼在兩種解釋器下執(zhí)行可能會(huì)有不同的結(jié)果。如果你的代碼要放到PyPy下執(zhí)行,就需要了解PyPy和CPython的不同點(diǎn)。
Jython
Jython是運(yùn)行在Java平臺(tái)上的Python解釋器,可以直接把Python代碼編譯成Java字節(jié)碼執(zhí)行。
IronPython
IronPython和Jython類似,只不過IronPython是運(yùn)行在微軟.Net平臺(tái)上的Python解釋器,可以直接把Python代碼編譯成.Net的字節(jié)碼。
小結(jié)
Python的解釋器很多,但使用最廣泛的還是CPython。如果要和Java或.Net平臺(tái)交互,最好的辦法不是用Jython或IronPython,而是通過網(wǎng)絡(luò)調(diào)用來交互,確保各程序之間的獨(dú)立性。
END.
OK今天就為大家介紹這么多了。
我是EC君,如果你喜歡我的文章,請(qǐng)幫忙點(diǎn)個(gè)關(guān)注!點(diǎn)個(gè)喜歡吧!
也可以點(diǎn)擊作者信息,掃描微信二維碼關(guān)注我的個(gè)人微信公眾號(hào)。
你的鼓勵(lì)將是我們共同進(jìn)步的源泉。