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