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