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