Python由(you)荷(he)蘭數(shu)學和計(ji)算機科學研究(jiu)學會的(de)(de)(de)(de)吉多·范羅蘇姆于(yu)1990年代初設(she)計(ji),作(zuo)為一門叫做ABC語(yu)(yu)言(yan)(yan)的(de)(de)(de)(de)替(ti)代品。Python提(ti)供了高效的(de)(de)(de)(de)高級數(shu)據結構(gou),還(huan)能簡單有(you)效地面向對象編(bian)程。Python語(yu)(yu)法和動態類型,以及解釋(shi)型語(yu)(yu)言(yan)(yan)的(de)(de)(de)(de)本質,使(shi)它(ta)成為多數(shu)平臺上(shang)寫腳本和快速(su)開發(fa)應用的(de)(de)(de)(de)編(bian)程語(yu)(yu)言(yan)(yan),隨著版本的(de)(de)(de)(de)不斷更新和語(yu)(yu)言(yan)(yan)新功能的(de)(de)(de)(de)添加,逐漸被用于(yu)獨立的(de)(de)(de)(de)、大型項目的(de)(de)(de)(de)開發(fa)。
Python在各個(ge)(ge)編程語言中(zhong)比較適(shi)合(he)新手學(xue)習,Python解釋器易于擴展,可以使用C語言或C++(或者(zhe)其(qi)他(ta)可以通過C調用的語言)擴展新的功能和(he)數據類(lei)型。Python也可用于可定制化軟件中(zhong)的擴展程序語言。Python豐(feng)富的標準庫,提(ti)供(gong)了適(shi)用于各個(ge)(ge)主要(yao)系統平臺的源碼或機器碼。
自(zi)20世紀90年代(dai)初Python語言誕生(sheng)至今,它已被逐漸廣泛應用于系統管理(li)任務的處理(li)和Web編程。
1995年,Guido van Rossum在(zai)弗吉(ji)尼亞州的國家創新研究公司(CNRI)繼(ji)續(xu)他在(zai)Python上的工作,并在(zai)那里發布了該軟件(jian)的多個(ge)版本(ben)。
2000年(nian)五月(yue),Guido van Rossum和Python核心(xin)開發(fa)團隊轉(zhuan)到BeOpen.com并組建了(le)BeOpen PythonLabs團隊。同年(nian)十月(yue),BeOpen PythonLabs團隊轉(zhuan)到Digital Creations(現(xian)為Zope Corporation)。
2001年,Python軟件基金會(PSF)成(cheng)立,這是(shi)(shi)一個專為擁(yong)有Python相關知識產權(quan)而創建的非營利(li)組(zu)織(zhi)。Zope Corporation是(shi)(shi)PSF的贊助成(cheng)員。
Python的(de)創始(shi)人(ren)為(wei)荷蘭人(ren)吉(ji)多·范羅蘇姆(mu)(Guido van Rossum)。1989年圣(sheng)(sheng)誕節(jie)期間,在阿姆(mu)斯特丹(dan),Guido為(wei)了打發圣(sheng)(sheng)誕節(jie)的(de)無趣(qu),決心開發一(yi)個新的(de)腳本(ben)解(jie)釋(shi)程(cheng)序,作為(wei)ABC語言(yan)的(de)一(yi)種繼承。之所以選中單(dan)詞(ci)Python(意為(wei)大蟒蛇)作為(wei)該編程(cheng)語言(yan)的(de)名(ming)字,是因為(wei)英國(guo)20世紀70年代首播的(de)電(dian)視喜劇《蒙提(ti)·派森的(de)飛行馬(ma)戲團(tuan)》(Monty Python's Flying Circus)。
ABC是(shi)由Guido參(can)加設計的一種(zhong)教學語言(yan)。就(jiu)Guido本人看來,ABC這(zhe)種(zhong)語言(yan)非常優美和強大(da),是(shi)專門為非專業程序員設計的。但(dan)是(shi)ABC語言(yan)并(bing)沒有成功,究其(qi)(qi)原因,Guido認為是(shi)其(qi)(qi)非開放(fang)造成的。Guido決心在(zai)(zai)Python中避免這(zhe)一錯誤。同時,他還想實現在(zai)(zai)ABC中閃現過但(dan)未曾實現的東西。
就(jiu)這樣(yang),Python在(zai)Guido手中誕生了(le)。可以說,Python是從ABC發(fa)展起來,主要受到了(le)Modula-3(另(ling)一種相當優美且(qie)強大(da)的語言,為小型(xing)團體所設計的)的影(ying)響。并且(qie)結合了(le)Unix shell和C的習(xi)慣。
Python已經成為(wei)最受歡迎的(de)程序(xu)設計(ji)語(yu)言之一(yi)。自(zi)從2004年以(yi)后,python的(de)使用率呈線性增長。Python 2于2000年10月16日發布,穩定版本是Python 2.7。Python 3于2008年12月3日發布,不完全(quan)兼容Python 2。2011年1月,它被(bei)TIOBE編程語(yu)言排行榜評為(wei)2010年度語(yu)言。
由(you)于Python語(yu)言(yan)(yan)的(de)簡潔性、易讀性以及(ji)(ji)可(ke)擴(kuo)(kuo)展性,在(zai)(zai)國外用(yong)(yong)Python做科(ke)(ke)學(xue)計(ji)算(suan)的(de)研究機(ji)構(gou)日益增多(duo),一些知(zhi)名(ming)大學(xue)已經(jing)(jing)采(cai)用(yong)(yong)Python來教授程(cheng)(cheng)序設計(ji)課(ke)程(cheng)(cheng)。例(li)如(ru)(ru)卡耐基(ji)梅(mei)隆(long)大學(xue)的(de)編程(cheng)(cheng)基(ji)礎、麻省理(li)(li)工(gong)學(xue)院的(de)計(ji)算(suan)機(ji)科(ke)(ke)學(xue)及(ji)(ji)編程(cheng)(cheng)導論(lun)就使用(yong)(yong)Python語(yu)言(yan)(yan)講授。眾(zhong)多(duo)開源的(de)科(ke)(ke)學(xue)計(ji)算(suan)軟件包都提(ti)供了(le)(le)Python的(de)調用(yong)(yong)接(jie)口,例(li)如(ru)(ru)著名(ming)的(de)計(ji)算(suan)機(ji)視覺庫(ku)(ku)OpenCV、三(san)維可(ke)視化(hua)庫(ku)(ku)VTK、醫學(xue)圖(tu)像處理(li)(li)庫(ku)(ku)ITK。而Python專(zhuan)用(yong)(yong)的(de)科(ke)(ke)學(xue)計(ji)算(suan)擴(kuo)(kuo)展庫(ku)(ku)就更多(duo)了(le)(le),例(li)如(ru)(ru)如(ru)(ru)下3個十分(fen)經(jing)(jing)典的(de)科(ke)(ke)學(xue)計(ji)算(suan)擴(kuo)(kuo)展庫(ku)(ku):NumPy、SciPy和matplotlib,它們分(fen)別為Python提(ti)供了(le)(le)快(kuai)速數組處理(li)(li)、數值運算(suan)以及(ji)(ji)繪圖(tu)功能。因此Python語(yu)言(yan)(yan)及(ji)(ji)其眾(zhong)多(duo)的(de)擴(kuo)(kuo)展庫(ku)(ku)所構(gou)成的(de)開發環(huan)境十分(fen)適合工(gong)程(cheng)(cheng)技術(shu)、科(ke)(ke)研人員處理(li)(li)實驗數據、制作圖(tu)表,甚至開發科(ke)(ke)學(xue)計(ji)算(suan)應用(yong)(yong)程(cheng)(cheng)序。2018年(nian)3月(yue),該語(yu)言(yan)(yan)作者(zhe)在(zai)(zai)郵件列表上宣(xuan)布(bu)Python 2.7將于2020年(nian)1月(yue)1日終止支持。用(yong)(yong)戶如(ru)(ru)果想要在(zai)(zai)這(zhe)個日期之后繼(ji)續得到與Python 2.7有(you)關(guan)的(de)支持,則(ze)需要付費給(gei)商業供應商。
Python的(de)(de)設(she)計(ji)目(mu)標(biao)之(zhi)一是(shi)讓代碼(ma)具備(bei)高度的(de)(de)可閱讀性。它(ta)設(she)計(ji)時盡量使用其(qi)它(ta)語言經(jing)常使用的(de)(de)標(biao)點符號和英(ying)文單字(zi),讓代碼(ma)看起來整潔美觀。它(ta)不(bu)(bu)像其(qi)他的(de)(de)靜態語言如C、Pascal那樣需要重復書寫聲明(ming)語句,也不(bu)(bu)像它(ta)們的(de)(de)語法(fa)那樣經(jing)常有特殊情況和意外(wai)。
Python開發者(zhe)有意(yi)讓違反了縮進(jin)規則的程(cheng)(cheng)序不能通過編(bian)譯,以此來強制程(cheng)(cheng)序員(yuan)養成良好的編(bian)程(cheng)(cheng)習慣。并且Python語言利用縮進(jin)表(biao)示(shi)語句塊(kuai)的開始和退(tui)出(Off-side規則),而非使用花括號或者(zhe)某種關鍵字。增(zeng)加(jia)縮進(jin)表(biao)示(shi)語句塊(kuai)的開始,而減少縮進(jin)則表(biao)示(shi)語句塊(kuai)的退(tui)出。縮進(jin)成為了語法的一部分。
根據PEP的(de)規(gui)定,必須使用(yong)4個空(kong)格來表示(shi)每級縮進。使用(yong)Tab字符(fu)和其它(ta)(ta)數目的(de)空(kong)格雖然都可以編譯通過,但不符(fu)合編碼規(gui)范。支持Tab字符(fu)和其它(ta)(ta)數目的(de)空(kong)格僅(jin)(jin)僅(jin)(jin)是為(wei)兼容很舊的(de)的(de)Python程(cheng)序和某(mou)些(xie)有問(wen)題的(de)編輯程(cheng)序。
if語(yu)句,當條件成(cheng)立時運行語(yu)句塊(kuai)。經常與(yu)else,elif(相當于else if)配合(he)使用,稱為if-elif-else語(yu)句。
for語句,遍歷列表、字(zi)符串、字(zi)典、集合(he)等(deng)迭代器(qi)(容器(qi)),依(yi)次處理迭代器(qi)中的每個元素。有時和else連用,稱為for-else語句。
while語句(ju)(ju),當條(tiao)件為真時,循環運行語句(ju)(ju)塊。有時和else配合使(shi)用,稱(cheng)為while-else語句(ju)(ju)。
try語句,必(bi)與except配(pei)合使用處理在程序運行中出現的異(yi)常(chang)情況,稱為try-except語句。
class語句,用于定義類型。
def語句,用于定義(yi)函數和類型的(de)方法。
pass語句,表(biao)示此行為空,不運行任何操作。
assert語句,用于程序(xu)調(diao)試(shi)(shi)階段時測試(shi)(shi)運行條(tiao)件是否滿足。
with語句,Python2.6以后定義的語法,在一個場景中運行(xing)語句塊。比如,運行(xing)語句塊前加密(mi),然后在語句塊運行(xing)退(tui)出后解密(mi)。
yield語句,在迭代(dai)器函數(shu)內使用,用于返回一個(ge)(ge)元素(su)。自(zi)從Python 2.5版本以后(hou)。這個(ge)(ge)語句變成一個(ge)(ge)運算符(fu)。
raise語句(ju),制造一(yi)個錯誤。
import語句(ju),導入一個(ge)模塊(kuai)或包(bao)。
from…import語(yu)句,從(cong)包導(dao)入模(mo)塊或從(cong)模(mo)塊導(dao)入某個對象。
import…as語句,將導入(ru)的對象(xiang)賦值給一(yi)個變量。
in語(yu)句,判斷一(yi)個(ge)對(dui)象(xiang)是否在一(yi)個(ge)字符串(chuan)/列(lie)表/元組里。
Python的表達式寫(xie)法(fa)與C/C++類似。只是在某些寫(xie)法(fa)有所差別(bie)。
主要的算術(shu)運算符與C/C++類似。+,-,*,/,//,**,~,%分別表示加(jia)法(fa)或(huo)(huo)者取(qu)正、減法(fa)或(huo)(huo)者取(qu)負、乘法(fa)、除法(fa)、整除、乘方、取(qu)補(bu)、取(qu)余(yu)。
Python使用and,or,not表示(shi)邏輯運算(suan)。
is,is not用(yong)于比(bi)較兩個變量是否(fou)是同一個對象(xiang)。in,not in用(yong)于判斷一個對象(xiang)是否(fou)屬于另外一個對象(xiang)。
Python區分(fen)列表(list)和元(yuan)組(tuple)兩種類型。list的(de)(de)寫法(fa)是(shi)[1,2,3],而(er)tuple的(de)(de)寫法(fa)是(shi)(1,2,3)。可以改變list中的(de)(de)元(yuan)素,而(er)不(bu)能改變tuple。在某些情況下,tuple的(de)(de)括號可以省略。tuple對(dui)于賦(fu)值(zhi)語句有(you)特(te)殊的(de)(de)處理。因(yin)此,可以同時賦(fu)值(zhi)給多個變量。
Python使用'(單(dan)(dan)引(yin)號(hao))和(he)"(雙引(yin)號(hao))來表(biao)示單(dan)(dan)行字(zi)(zi)(zi)符串,用'''(三個連續單(dan)(dan)引(yin)號(hao))和(he)"""(三個連續雙引(yin)號(hao))與Perl、Unix Shell語(yu)言或者Ruby、Groovy等語(yu)言不一(yi)樣,兩(liang)種符號(hao)作用相(xiang)同。一(yi)般地,如果(guo)字(zi)(zi)(zi)符串中出現(xian)了(le)雙引(yin)號(hao),就使用單(dan)(dan)引(yin)號(hao)來表(biao)示字(zi)(zi)(zi)符串;反(fan)之則使用雙引(yin)號(hao)。如果(guo)都沒有出現(xian),就依(yi)個人喜好選擇。出現(xian)在字(zi)(zi)(zi)符串中的(反(fan)斜杠)被解釋為特殊字(zi)(zi)(zi)符,比如 表(biao)示換行符。表(biao)達式前加r指示Python不解釋字(zi)(zi)(zi)符串中出現(xian)的。這種寫法通常(chang)用于(yu)編寫正則表(biao)達式或者Windows文件路徑。
Python支(zhi)持列(lie)表(biao)(biao)切割(list slices),可以取得(de)完整列(lie)表(biao)(biao)的一部分。支(zhi)持切割操作(zuo)的類(lei)型有(you)str,bytes,list,tuple等(deng)。它的語法是...[left:right]或者(zhe)...[left:right:stride]。假定nums變量的值是[1,3,5,7,8,13,20],那么下(xia)面幾個語句(ju)為真:
nums[2:5]==[5,7,8]從(cong)下標(biao)(biao)為2的(de)(de)元(yuan)素切割到下標(biao)(biao)為5的(de)(de)元(yuan)素,但不包含下標(biao)(biao)為5的(de)(de)元(yuan)素。
Python函(han)數(shu)(shu)支(zhi)持遞歸、默認參數(shu)(shu)值、可(ke)(ke)變參數(shu)(shu),但(dan)不(bu)支(zhi)持函(han)數(shu)(shu)重(zhong)載。為了增強(qiang)代碼的(de)(de)可(ke)(ke)讀(du)性,可(ke)(ke)以在(zai)函(han)數(shu)(shu)后(hou)書寫“文檔字符串”(Documentation Strings,或者簡稱docstrings),用于解釋函(han)數(shu)(shu)的(de)(de)作用、參數(shu)(shu)的(de)(de)類型與意義、返回值類型與取值范圍等。可(ke)(ke)以使(shi)用內置(zhi)函(han)數(shu)(shu)help打印出函(han)數(shu)(shu)的(de)(de)使(shi)用幫助。
對(dui)象(xiang)(xiang)的(de)方法(fa)(fa)(fa)是(shi)指綁(bang)定到對(dui)象(xiang)(xiang)的(de)函數(shu)(shu)。調用(yong)對(dui)象(xiang)(xiang)方法(fa)(fa)(fa)的(de)語法(fa)(fa)(fa)是(shi)instance.method(arguments)。它(ta)等價于調用(yong)Class.method(instance,arguments)。當(dang)定義對(dui)象(xiang)(xiang)方法(fa)(fa)(fa)時,必須顯式地定義第(di)一(yi)(yi)個參數(shu)(shu),一(yi)(yi)般(ban)該參數(shu)(shu)名(ming)都使(shi)用(yong)self,用(yong)于訪問對(dui)象(xiang)(xiang)的(de)內(nei)部數(shu)(shu)據。這里的(de)self相當(dang)于C++,Java里面的(de)this變量,但(dan)是(shi)我們還(huan)可以使(shi)用(yong)任何其它(ta)合(he)法(fa)(fa)(fa)的(de)參數(shu)(shu)名(ming),比(bi)如this和 mine等,self與(yu)C++,Java里面的(de)this不完全(quan)一(yi)(yi)樣,它(ta)可以被看作是(shi)一(yi)(yi)個習慣性(xing)的(de)用(yong)法(fa)(fa)(fa),我們傳入任何其它(ta)的(de)合(he)法(fa)(fa)(fa)名(ming)稱都行。
Python認識一些以“__”開始并(bing)以“__”結束(shu)的特殊方法(fa)名,它們用于實現(xian)運算符(fu)重載和實現(xian)多種特殊功能,叫做魔(mo)法(fa)方法(fa)。
Python采(cai)用(yong)動(dong)態(tai)類(lei)型(xing)(xing)系統。在編(bian)譯的(de)時候(hou),Python不(bu)會(hui)檢查(cha)對象是(shi)否(fou)擁有(you)被調用(yong)的(de)方法(fa)或者屬(shu)性,而(er)是(shi)直至(zhi)運行時,才(cai)做出(chu)檢查(cha)。所以操(cao)作對象時可能會(hui)拋出(chu)異常(chang)。不(bu)過,雖然Python采(cai)用(yong)動(dong)態(tai)類(lei)型(xing)(xing)系統,它同時也是(shi)強類(lei)型(xing)(xing)的(de)。Python禁止沒有(you)明(ming)確定(ding)義的(de)操(cao)作,比如數字加字符串(chuan)。
與(yu)其它(ta)面(mian)向對(dui)象(xiang)語言一樣,Python允許程序員(yuan)定義(yi)類(lei)型(xing)(xing)。構造一個對(dui)象(xiang)只需(xu)要像函數(shu)一樣調用類(lei)型(xing)(xing)即可,比如,對(dui)于前面(mian)定義(yi)的(de)Fish類(lei)型(xing)(xing),使用Fish。類(lei)型(xing)(xing)本身也是特殊類(lei)型(xing)(xing)type的(de)對(dui)象(xiang)(type類(lei)型(xing)(xing)本身也是type對(dui)象(xiang)),這種特殊的(de)設(she)計允許對(dui)類(lei)型(xing)(xing)進行(xing)反射(she)編程。
Python內置豐富的數據(ju)(ju)類(lei)型。與Java、C++相比,這(zhe)些(xie)數據(ju)(ju)類(lei)型有(you)效(xiao)地減少(shao)代(dai)碼的長度(du)。
除了(le)各種數據類型,Python語言還用類型來表示函數、模(mo)塊(kuai)、類型本身、對象的(de)方法、編譯后的(de)Python代碼、運行時信息等(deng)等(deng)。因此,Python具備很強的(de)動態(tai)性。
Python使用(yong)與C、Java類似的運算符,支(zhi)持整數(shu)(shu)(shu)與浮點數(shu)(shu)(shu)的數(shu)(shu)(shu)學(xue)運算。同(tong)時還支(zhi)持復數(shu)(shu)(shu)運算與無窮位數(shu)(shu)(shu)。
fractions模(mo)塊用于支持(chi)分(fen)數(shu)運算(suan);decimal模(mo)塊用于支持(chi)高精度的浮點(dian)數(shu)運算(suan)。
Python定(ding)義求余運(yun)行a%b的值處于(yu)開區(qu)間[0,b)內,如(ru)果b是負(fu)數(shu),開區(qu)間變為(b,0]。這是一個(ge)很常(chang)見的定(ding)義方(fang)式。不過(guo)其實它依(yi)賴(lai)于(yu)整除的定(ding)義。為了讓(rang)方(fang)程(cheng)式:b*(a//b)+a%b=a恒真,整除運(yun)行需要(yao)向(xiang)負(fu)無窮(qiong)小方(fang)向(xiang)取值。比如(ru)7//3的結(jie)果是2,而(-7)//3的結(jie)果卻是-3。這個(ge)算法(fa)與(yu)其它很多編程(cheng)語(yu)言(yan)不一樣,需要(yao)注意,它們(men)的整除運(yun)算會向(xiang)0的方(fang)向(xiang)取值。
Python允許像(xiang)數(shu)學(xue)的常用寫法那樣連著寫兩個比較運行(xing)符。
1.列出模塊中的函(han)數
用import導入模(mo)塊后,可使用函(han)數(shu)dir(m)列(lie)出模(mo)塊的所有(you)函(han)數(shu),import是(shi)導入模(mo)塊的命(ming)令,m是(shi)模(mo)塊名。
3.查看某個函數的文檔(dang)幫(bang)助信(xin)息
可以用函(han)數help(函(han)數)來查看某個函(han)數的文檔幫助信息。
CGI目前由NCSA維(wei)護,NCSA定義CGI如下(xia):
CGI(Common Gateway Interface),通用網(wang)關(guan)接口,它是一段程序,運行在(zai)服(fu)(fu)務器(qi)上如:HTTP服(fu)(fu)務器(qi),提供同客戶端HTML頁面的(de)接口。
CGI程序可以是Python腳(jiao)本、Perl腳(jiao)本、Shell腳(jiao)本、C或者C++程序等(deng)。
在你進(jin)行CGI編程(cheng)前,確保您(nin)的Web服務(wu)器(qi)支(zhi)持(chi)CGI及已經(jing)配置了(le)CGI的處理(li)程(cheng)序。
所有的HTTP服務器執行CGI程序(xu)都保(bao)存在(zai)一個(ge)預先(xian)配置的目(mu)錄(lu)(lu)。這個(ge)目(mu)錄(lu)(lu)被(bei)稱(cheng)為(wei)CGI目(mu)錄(lu)(lu),并(bing)按照慣例(li),它被(bei)命名為(wei)/var/www/cgi-bin目(mu)錄(lu)(lu)。
CGI文(wen)件的擴展名為(wei).cgi,python也(ye)可以使用.py擴展名。
默認(ren)情況下,Linux服(fu)務器配(pei)置運行(xing)的cgi-bin目錄中為/var/www。
簡(jian)單:Python是一種代表簡(jian)單主義(yi)思想的語(yu)(yu)言(yan)。閱讀(du)一個(ge)良好的Python程序就感覺(jue)像是在讀(du)英(ying)語(yu)(yu)一樣。它使(shi)你能夠專(zhuan)注于解決問題而不是去搞明白語(yu)(yu)言(yan)本(ben)身。
易學(xue):Python極其容易上(shang)手,因為Python有極其簡單的(de)說明文檔。
易讀、易維護:風(feng)格(ge)清晰劃一、強(qiang)制縮進
速(su)度較快:Python的(de)底層是用C語(yu)言寫的(de),很多(duo)標準庫和第三(san)方庫也(ye)都是用C寫的(de),運行速(su)度非常快。
免費、開源:Python是FLOSS(自(zi)由(you)(you)/開放源碼(ma)(ma)軟件)之一。使用者可以自(zi)由(you)(you)地(di)發布這個軟件的拷(kao)貝、閱讀它(ta)(ta)的源代碼(ma)(ma)、對它(ta)(ta)做(zuo)改動(dong)、把它(ta)(ta)的一部(bu)分用于新的自(zi)由(you)(you)軟件中。FLOSS是基于一個團(tuan)體分享知識的概念。
高層(ceng)語言:用(yong)Python語言編寫程序的時(shi)候無需考慮諸如(ru)如(ru)何管(guan)理你的程序使用(yong)的內存一類的底(di)層(ceng)細節。
可移(yi)植(zhi)性:由于它(ta)的開(kai)(kai)源本質,Python已經(jing)被移(yi)植(zhi)在許多(duo)平臺(tai)(tai)上(shang)(經(jing)過(guo)改動使它(ta)能夠(gou)工作在不同平臺(tai)(tai)上(shang))。這些平臺(tai)(tai)包括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以(yi)及Google基于linux開(kai)(kai)發的android平臺(tai)(tai)。
解釋性:一個(ge)用編譯性語言比(bi)如C或(huo)(huo)C++寫(xie)的(de)程序可以從源文件(即C或(huo)(huo)C++語言)轉換到一個(ge)你的(de)計(ji)算機使用的(de)語言(二進制代碼,即0和(he)1)。這(zhe)個(ge)過程通過編譯器和(he)不(bu)同(tong)的(de)標(biao)記、選項(xiang)完成(cheng)。
運(yun)行(xing)程(cheng)序(xu)(xu)的時候,連(lian)接/轉載器軟件把你的程(cheng)序(xu)(xu)從硬盤復制到內存中并且運(yun)行(xing)。而Python語言寫的程(cheng)序(xu)(xu)不需要(yao)編譯成二進制代碼。你可以(yi)直接從源代碼運(yun)行(xing)程(cheng)序(xu)(xu)。
在計算機(ji)內(nei)部,Python解釋器(qi)把(ba)源(yuan)代碼轉換成稱為(wei)字節(jie)碼的(de)中間形(xing)式,然(ran)后再把(ba)它翻譯成計算機(ji)使(shi)用(yong)的(de)機(ji)器(qi)語言(yan)并(bing)運行。這使(shi)得(de)使(shi)用(yong)Python更加(jia)簡單。也使(shi)得(de)Python程序(xu)更加(jia)易于移植。
面(mian)向對(dui)(dui)象(xiang):Python既支持面(mian)向過程(cheng)(cheng)(cheng)(cheng)的編程(cheng)(cheng)(cheng)(cheng)也支持面(mian)向對(dui)(dui)象(xiang)的編程(cheng)(cheng)(cheng)(cheng)。在“面(mian)向過程(cheng)(cheng)(cheng)(cheng)”的語言中,程(cheng)(cheng)(cheng)(cheng)序是(shi)由(you)過程(cheng)(cheng)(cheng)(cheng)或僅僅是(shi)可(ke)重用代碼(ma)的函(han)數(shu)(shu)構建(jian)起(qi)來的。在“面(mian)向對(dui)(dui)象(xiang)”的語言中,程(cheng)(cheng)(cheng)(cheng)序是(shi)由(you)數(shu)(shu)據和功能組合而成的對(dui)(dui)象(xiang)構建(jian)起(qi)來的。
Python是完全面向對象的語言(yan)。函(han)數、模塊、數字(zi)、字(zi)符(fu)串都是對象。并且完全支(zhi)持(chi)繼(ji)承、重(zhong)載、派生、多(duo)繼(ji)承,有益(yi)于增(zeng)強源代碼的復用(yong)性。Python支(zhi)持(chi)重(zhong)載運算符(fu)和動態類型。相對于Lisp這種傳統的函(han)數式編程(cheng)語言(yan),Python對函(han)數式設計只提供了(le)有限的支(zhi)持(chi)。有兩個(ge)標準庫(functools,itertools)提供了(le)Haskell和Standard ML中久經考驗(yan)的函(han)數式程(cheng)序(xu)設計工具。
可擴展性、可擴充性:如果需要一段關鍵(jian)代碼運行得更(geng)快或者希望某些算法不(bu)公開,可以部(bu)分程序用C或C++編寫,然后在Python程序中(zhong)使用它們。
Python本(ben)(ben)身被設計(ji)為(wei)可(ke)擴(kuo)充的(de)(de)(de)(de)。并非所有的(de)(de)(de)(de)特性(xing)(xing)和(he)(he)功能(neng)(neng)都集(ji)成到(dao)語言(yan)(yan)核(he)心。Python提供了(le)豐富的(de)(de)(de)(de)API和(he)(he)工具,以(yi)(yi)便程(cheng)序(xu)(xu)員能(neng)(neng)夠輕松地使(shi)(shi)(shi)用(yong)C語言(yan)(yan)、C++、Cython來(lai)編寫擴(kuo)充模塊。Python編譯器本(ben)(ben)身也可(ke)以(yi)(yi)被集(ji)成到(dao)其它需要(yao)腳本(ben)(ben)語言(yan)(yan)的(de)(de)(de)(de)程(cheng)序(xu)(xu)內(nei)。因此,很(hen)多人還把Python作為(wei)一種“膠水語言(yan)(yan)”(glue language)使(shi)(shi)(shi)用(yong)。使(shi)(shi)(shi)用(yong)Python將(jiang)其他語言(yan)(yan)編寫的(de)(de)(de)(de)程(cheng)序(xu)(xu)進行集(ji)成和(he)(he)封裝。在(zai)Google內(nei)部的(de)(de)(de)(de)很(hen)多項(xiang)目(mu)(mu),例如Google Engine使(shi)(shi)(shi)用(yong)C++編寫性(xing)(xing)能(neng)(neng)要(yao)求極高(gao)的(de)(de)(de)(de)部分,然后用(yong)Python或Java/Go調(diao)用(yong)相應(ying)的(de)(de)(de)(de)模塊。《Python技術手冊》的(de)(de)(de)(de)作者馬特利(Alex Martelli)說:“這很(hen)難講,不過,2004年,Python已(yi)(yi)在(zai)Google內(nei)部使(shi)(shi)(shi)用(yong),Google召募(mu)許多Python高(gao)手,但(dan)在(zai)這之前(qian)就已(yi)(yi)決(jue)定使(shi)(shi)(shi)用(yong)Python,他們的(de)(de)(de)(de)目(mu)(mu)的(de)(de)(de)(de)是Python where we can,C++ where we must,在(zai)操控硬(ying)件的(de)(de)(de)(de)場合使(shi)(shi)(shi)用(yong)C++,在(zai)快(kuai)速開(kai)發時(shi)候使(shi)(shi)(shi)用(yong)Python。”
可(ke)(ke)嵌(qian)入性:可(ke)(ke)以把Python嵌(qian)入C/C++程序,從而向程序用戶提供腳本功能(neng)。
豐富的庫:Python標準庫確實很龐(pang)大。它可以幫助處理(li)各種(zhong)工作(zuo),包括(kuo)正則表達式(shi)、文檔生成、單元測試、線(xian)程(cheng)、數據庫、網頁瀏覽器、CGI、FTP、電子郵(you)件(jian)、XML、XML-RPC、HTML、WAV文件(jian)、密碼(ma)系(xi)統(tong)、GUI(圖形用戶界面)、Tk和(he)其他與系(xi)統(tong)有關的操作(zuo)。這被稱作(zuo)Python的“功能齊全”理(li)念。除了標準庫以外(wai),還有許(xu)多其他高質量的庫,如wxPython、Twisted和(he)Python圖像庫等(deng)等(deng)。
規范(fan)的(de)(de)(de)代(dai)碼:Python采用強制縮(suo)(suo)進的(de)(de)(de)方(fang)式使(shi)得代(dai)碼具(ju)有較(jiao)好可讀(du)性。而(er)Python語(yu)言寫的(de)(de)(de)程(cheng)序(xu)不需(xu)要編(bian)譯(yi)成二(er)進制代(dai)碼。Python的(de)(de)(de)作(zuo)者設(she)計限制性很強的(de)(de)(de)語(yu)法,使(shi)得不好的(de)(de)(de)編(bian)程(cheng)習(xi)慣(例如if語(yu)句的(de)(de)(de)下一(yi)行(xing)不向右縮(suo)(suo)進)都不能通過(guo)(guo)編(bian)譯(yi)。其中很重要的(de)(de)(de)一(yi)項就是(shi)(shi)Python的(de)(de)(de)縮(suo)(suo)進規則(ze)。一(yi)個(ge)和(he)其他大(da)多數(shu)語(yu)言(如C)的(de)(de)(de)區別(bie)就是(shi)(shi),一(yi)個(ge)模(mo)塊(kuai)(kuai)的(de)(de)(de)界(jie)限,完全是(shi)(shi)由(you)每行(xing)的(de)(de)(de)首字(zi)符在這(zhe)一(yi)行(xing)的(de)(de)(de)位(wei)置(zhi)來決定(而(er)C語(yu)言是(shi)(shi)用一(yi)對(dui)大(da)括號(hao)來明(ming)確的(de)(de)(de)定出(chu)模(mo)塊(kuai)(kuai)的(de)(de)(de)邊界(jie),與字(zi)符的(de)(de)(de)位(wei)置(zhi)毫無關系)。通過(guo)(guo)強制程(cheng)序(xu)員(yuan)們縮(suo)(suo)進(包括if,for和(he)函數(shu)定義等所有需(xu)要使(shi)用模(mo)塊(kuai)(kuai)的(de)(de)(de)地(di)方(fang)),Python確實使(shi)得程(cheng)序(xu)更(geng)加清晰和(he)美觀。
高級(ji)動態編(bian)程(cheng):雖然Python可能被粗略地分類為“腳本語(yu)(yu)言”(script language),但實(shi)際上一(yi)些大規模(mo)軟件(jian)開發計劃(hua)例如Zope、Mnet及BitTorrent,Google也廣泛(fan)地使用它。Python的支(zhi)持者較(jiao)喜歡稱它為一(yi)種高級(ji)動態編(bian)程(cheng)語(yu)(yu)言,原因是“腳本語(yu)(yu)言”泛(fan)指僅作簡單(dan)程(cheng)序設計任務(wu)(wu)的語(yu)(yu)言,如shellscript、VBScript等只(zhi)能處理簡單(dan)任務(wu)(wu)的編(bian)程(cheng)語(yu)(yu)言,并不(bu)能與Python相提并論。
做(zuo)科(ke)學(xue)計(ji)算(suan)優(you)點多(duo):說(shuo)起科(ke)學(xue)計(ji)算(suan),首先會被(bei)提(ti)到的可(ke)能是MATLAB。除了MATLAB的一些專(zhuan)業性很強的工(gong)具箱還無(wu)法被(bei)替代之外,MATLAB的大部分(fen)常用功能都可(ke)以(yi)在Python世界中找到相應的擴(kuo)展(zhan)庫。和MATLAB相比,用Python做(zuo)科(ke)學(xue)計(ji)算(suan)有如(ru)下優(you)點:
●首先,MATLAB是一款商用軟(ruan)件,并且價格不菲。而Python完全免(mian)費,眾多(duo)(duo)開(kai)源(yuan)的科學計算(suan)庫(ku)都提(ti)供(gong)了Python的調用接口(kou)。用戶可以在任何計算(suan)機上免(mian)費安裝Python及其(qi)絕(jue)大多(duo)(duo)數(shu)擴展庫(ku)。
●其次(ci),與(yu)MATLAB相比,Python是一門更(geng)易(yi)學、更(geng)嚴(yan)謹的程序(xu)設計語言。它(ta)能讓用戶(hu)編(bian)寫出更(geng)易(yi)讀、易(yi)維護的代碼(ma)。
●最后,MATLAB主要專注于工(gong)程(cheng)和科學計算(suan)。然而即使在計算(suan)領域(yu),也經(jing)常會(hui)遇到文件管(guan)理、界面設計、網絡通信等各種(zhong)需求。而Python有(you)著豐富(fu)的(de)擴(kuo)展庫(ku),可以輕易完成各種(zhong)高級任務(wu),開(kai)發者可以用(yong)Python實現完整(zheng)應(ying)用(yong)程(cheng)序所(suo)需的(de)各種(zhong)功能。
單行(xing)語句和命令行(xing)輸出問題(ti):很多時候不能將程序連(lian)寫成一(yi)(yi)行(xing),如import sys;for i in sys.path:print i。而perl和awk就無此限制,可(ke)以較為方便的(de)在shell下完成簡(jian)單程序,不需要如Python一(yi)(yi)樣,必須將程序寫入一(yi)(yi)個.py文件。
給初學者(zhe)帶(dai)來(lai)困(kun)惑:獨特的(de)語(yu)法(fa),這(zhe)也(ye)許不(bu)應該被(bei)稱為局限,但是它用縮(suo)進來(lai)區分語(yu)句關(guan)系的(de)方式還是給很(hen)多初學者(zhe)帶(dai)來(lai)了困(kun)惑。即便是很(hen)有(you)經驗(yan)的(de)Python程序員,也(ye)可能(neng)陷(xian)入陷(xian)阱當(dang)中。
運行(xing)速(su)(su)度慢:這里是指(zhi)與C和C++相比(bi)。Python開(kai)發人員盡量避開(kai)不(bu)成熟或者不(bu)重要的(de)(de)優(you)化。一些針(zhen)對(dui)(dui)非重要部(bu)位的(de)(de)加快運行(xing)速(su)(su)度的(de)(de)補丁通常不(bu)會(hui)被合并到(dao)Python內(nei)。所以很(hen)多(duo)(duo)人認為Python很(hen)慢。不(bu)過,根據(ju)二(er)八定律,大多(duo)(duo)數程序對(dui)(dui)速(su)(su)度要求(qiu)不(bu)高。在某些對(dui)(dui)運行(xing)速(su)(su)度要求(qiu)很(hen)高的(de)(de)情況,Python設計(ji)師傾向于使(shi)(shi)用(yong)JIT技術,或者用(yong)使(shi)(shi)用(yong)C/C++語言改寫這部(bu)分程序。可用(yong)的(de)(de)JIT技術是PyPy。
對于一(yi)個特(te)定的問題,只要有(you)一(yi)種最好的方法(fa)來(lai)解決
這在由Tim Peters寫的(de)Python格言(稱為The Zen of Python)里面表述為:There should be one-and preferably only one-obvious way to do it。這正好(hao)和(he)Perl語(yu)言(另(ling)一種(zhong)功能類似(si)的(de)高(gao)級動態語(yu)言)的(de)中心思想TMTOWTDI(There's More Than One Way To Do It)完全相反。
Python的(de)(de)設計(ji)哲學(xue)是“優雅”、“明(ming)確”、“簡單”。因此,Perl語言中“總是有多(duo)種(zhong)(zhong)方(fang)法來(lai)做同一(yi)(yi)件事”的(de)(de)理(li)念(nian)在Python開發者(zhe)中通(tong)常是難以忍受的(de)(de)。Python開發者(zhe)的(de)(de)哲學(xue)是“用一(yi)(yi)種(zhong)(zhong)方(fang)法,最(zui)好是只有一(yi)(yi)種(zhong)(zhong)方(fang)法來(lai)做一(yi)(yi)件事”。在設計(ji)Python語言時,如果面(mian)臨多(duo)種(zhong)(zhong)選擇,Python開發者(zhe)一(yi)(yi)般會拒絕花俏的(de)(de)語法,而選擇明(ming)確的(de)(de)沒有或(huo)者(zhe)很少有歧義的(de)(de)語法。由于這(zhe)種(zhong)(zhong)設計(ji)觀念(nian)的(de)(de)差異,Python源代碼通(tong)常被(bei)(bei)認為比(bi)Perl具備更好的(de)(de)可(ke)讀性(xing),并且能夠支撐大規模的(de)(de)軟件開發。這(zhe)些準(zhun)則被(bei)(bei)稱(cheng)為Python格(ge)言。在Python解釋器內運(yun)行import this可(ke)以獲(huo)得(de)完整的(de)(de)列表。
Python在執行時,首(shou)先會將.py文件中的(de)(de)源代碼編譯成Python的(de)(de)byte code(字(zi)節(jie)碼),然(ran)后再由Python Virtual Machine(Python虛擬機)來執行這些(xie)編譯好的(de)(de)byte code。這種機制(zhi)的(de)(de)基(ji)(ji)本思想跟Java,.NET是(shi)一(yi)致的(de)(de)。然(ran)而(er),Python Virtual Machine與Java或.NET的(de)(de)Virtual Machine不同的(de)(de)是(shi),Python的(de)(de)Virtual Machine是(shi)一(yi)種更(geng)高級(ji)(ji)的(de)(de)Virtual Machine。這里(li)的(de)(de)高級(ji)(ji)并(bing)不是(shi)通常意(yi)義(yi)上的(de)(de)高級(ji)(ji),不是(shi)說(shuo)Python的(de)(de)Virtual Machine比(bi)(bi)(bi)Java或.NET的(de)(de)功能更(geng)強大,而(er)是(shi)說(shuo)和Java 或.NET相比(bi)(bi)(bi),Python的(de)(de)Virtual Machine距離真(zhen)實機器的(de)(de)距離更(geng)遠。或者可(ke)以(yi)(yi)這么(me)說(shuo),Python的(de)(de)Virtual Machine是(shi)一(yi)種抽象層次更(geng)高的(de)(de)Virtual Machine。基(ji)(ji)于C的(de)(de)Python編譯出的(de)(de)字(zi)節(jie)碼文件,通常是(shi).pyc格式(shi)。除此之外,Python還可(ke)以(yi)(yi)以(yi)(yi)交(jiao)互(hu)模(mo)式(shi)運(yun)行,比(bi)(bi)(bi)如主流(liu)操作系統Unix/Linux、Mac、Windows都可(ke)以(yi)(yi)直接在命令(ling)模(mo)式(shi)下直接運(yun)行Python交(jiao)互(hu)環(huan)境。直接下達(da)操作指令(ling)即可(ke)實現交(jiao)互(hu)操作。