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