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