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