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