一、什么是 Python饲帅?
最近感覺(jué)自己懈怠了很多仰迁,同時(shí)身邊總有雜事纏身辰晕,一直停滯不前梁肿。
所以想來(lái)想去蜓陌,還是用老辦法觅彰,寫(xiě)寫(xiě)文章,沉淀一下护奈。
最近 Python 大火缔莲,很多學(xué)校和機(jī)構(gòu)也已經(jīng)開(kāi)設(shè)了 Python 的課程,甚至國(guó)家在小學(xué)的課本里霉旗,高考的考試?yán)镆布尤肓?Python 的內(nèi)容。
正好最近自己也在學(xué)習(xí) Python 蛀骇,那就嘗試將整個(gè)內(nèi)容都整理出來(lái)厌秒,給后來(lái)的人一些學(xué)習(xí)經(jīng)驗(yàn)吧。
全文共5500字擅憔,閱讀要約10分鐘鸵闪。
1.1 關(guān)于 Python 你需要知道
Python的作者,Guido von Rossum暑诸,荷蘭人蚌讼。
- Python的發(fā)音與拼寫(xiě)
- Python的意思是蟒蛇,源于作者喜歡的一部電視劇 (C呢个榕?)
- Python的作者是Guido van Rossum(龜叔)
- Python是龜叔在1989年圣誕節(jié)期間篡石,為了打發(fā)無(wú)聊的圣誕節(jié)而用C編寫(xiě)的一個(gè)編程語(yǔ)言
- Python正式誕生于1991年
- Python的解釋器如今有多個(gè)語(yǔ)言實(shí)現(xiàn),我們常用的是CPython(官方版本的C語(yǔ)言實(shí)現(xiàn))西采,其他還有Jython(可以運(yùn)行在Java平臺(tái))凰萨、IronPython(可以運(yùn)行在.NET和Mono平臺(tái))、PyPy(Python實(shí)現(xiàn)的械馆,支持JIT即時(shí)編譯)
- Python目前有兩個(gè)版本胖眷,Python2和Python3,最新版分別為2.7.14和3.7.0霹崎,現(xiàn)階段大部分公司用的是Python2
- Life is shot, you need Python. 人生苦短珊搀,我用Python。
1.2 為什么要開(kāi)發(fā) Python
1.2.1 歷史的發(fā)展
1982年尾菇,Guido從阿姆斯特丹大學(xué)獲得了數(shù)學(xué)和計(jì)算機(jī)碩士學(xué)位境析。然而,盡管他算得上是一位數(shù)學(xué)家错沽,但他更加享受計(jì)算機(jī)帶來(lái)的樂(lè)趣簿晓。用他的話說(shuō),盡管擁有數(shù)學(xué)和計(jì)算機(jī)雙料資質(zhì)千埃,他總趨向于做計(jì)算機(jī)相關(guān)的工作憔儿,并熱衷于做任何和編程相關(guān)的活兒。
在那個(gè)時(shí)候放可,Guido接觸并使用過(guò)諸如Pascal谒臼、C朝刊、Fortran等語(yǔ)言。這些語(yǔ)言的基本設(shè)計(jì)原則是讓機(jī)器能更快運(yùn)行蜈缤。在80年代拾氓,雖然IBM和蘋(píng)果已經(jīng)掀起了個(gè)人電腦浪潮,但這些個(gè)人電腦的配置很低底哥。
比如早期的Macintosh咙鞍,只有8MHz的CPU主頻和128KB的RAM(隨機(jī)存取存儲(chǔ)器,是與CPU直接交換數(shù)據(jù)的內(nèi)部存儲(chǔ)器)趾徽,一個(gè)大的數(shù)組就能占滿內(nèi)存续滋。所有的編譯器的核心是做優(yōu)化,以便讓程序能夠運(yùn)行孵奶。
為了增進(jìn)效率疲酌,語(yǔ)言也迫使程序員像計(jì)算機(jī)一樣思考,以便能寫(xiě)出更符合機(jī)器口味的程序了袁。在那個(gè)時(shí)代朗恳,程序員恨不得用手榨取計(jì)算機(jī)每一寸的能力。有人甚至認(rèn)為C語(yǔ)言的指針是在浪費(fèi)內(nèi)存载绿。至于動(dòng)態(tài)類(lèi)型粥诫,內(nèi)存自動(dòng)管理,面向?qū)ο蟆?別想了卢鹦,那會(huì)讓你的電腦陷入癱瘓臀脏。
這種編程方式讓Guido感到苦惱。Guido知道如何用C語(yǔ)言寫(xiě)出一個(gè)功能冀自,但整個(gè)編寫(xiě)過(guò)程需要耗費(fèi)大量的時(shí)間揉稚,即使他已經(jīng)準(zhǔn)確的知道了如何實(shí)現(xiàn)。他的另一個(gè)選擇是shell熬粗。
Bourne Shell作為UNIX系統(tǒng)的解釋器已經(jīng)長(zhǎng)期存在搀玖。UNIX的管理員們常常用shell去寫(xiě)一些簡(jiǎn)單的腳本,以進(jìn)行一些系統(tǒng)維護(hù)的工作驻呐,比如定期備份灌诅、文件系統(tǒng)管理等等。shell可以像膠水一樣含末,將UNIX下的許多功能連接在一起猜拾。
許多C語(yǔ)言下上百行的程序,在shell下只用幾行就可以完成佣盒。然而挎袜,shell的本質(zhì)是調(diào)用命令。它并不是一個(gè)真正的語(yǔ)言。比如說(shuō)盯仪,shell沒(méi)有數(shù)值型的數(shù)據(jù)類(lèi)型紊搪,加法運(yùn)算都很復(fù)雜∪埃總之耀石,shell不能全面的調(diào)動(dòng)計(jì)算機(jī)的功能。
Guido希望有一種語(yǔ)言爸黄,這種語(yǔ)言能夠像C語(yǔ)言那樣滞伟,能夠全面調(diào)用計(jì)算機(jī)的功能接口,又可以像shell那樣馆纳,可以輕松的編程诗良。ABC語(yǔ)言讓Guido看到希望。ABC是由荷蘭的數(shù)學(xué)和計(jì)算機(jī)研究所開(kāi)發(fā)的鲁驶。Guido在該研究所工作,并參與到ABC語(yǔ)言的開(kāi)發(fā)舞骆。ABC語(yǔ)言以教學(xué)為目的钥弯。與當(dāng)時(shí)的大部分語(yǔ)言不同,ABC語(yǔ)言的目標(biāo)是“讓用戶感覺(jué)更好”督禽。ABC語(yǔ)言希望讓語(yǔ)言變得容易閱讀脆霎,容易使用,容易記憶狈惫,容易學(xué)習(xí)睛蛛,并以此來(lái)激發(fā)人們學(xué)習(xí)編程的興趣。
1.2.2 希望的誕生
比如下面是一段來(lái)自Wikipedia的ABC程序胧谈,這個(gè)程序用于統(tǒng)計(jì)文本中出現(xiàn)的詞的總數(shù):
HOW TO RETURN words document:
PUT {} IN collection
FOR line IN document:
FOR word IN split line:
IF word not.in collection:
INSERT word IN collection
RETURN collection
HOW TO用于定義一個(gè)函數(shù)忆肾。
一個(gè)Python程序員應(yīng)該很容易理解這段程序。
- ABC語(yǔ)言使用冒號(hào)和縮進(jìn)來(lái)表示程序塊菱肖。
- 行尾沒(méi)有分號(hào)客冈。
- for和if結(jié)構(gòu)中也沒(méi)有括號(hào)() 。
- 賦值采用的是PUT稳强,而不是更常見(jiàn)的等號(hào)场仲。
這些改動(dòng)讓ABC程序讀起來(lái)像一段文字。
盡管已經(jīng)具備了良好的可讀性和易用性退疫,ABC語(yǔ)言最終沒(méi)有流行起來(lái)渠缕。在當(dāng)時(shí),ABC語(yǔ)言編譯器需要比較高配置的電腦才能運(yùn)行褒繁。而這些電腦的使用者通常精通計(jì)算機(jī)亦鳞,他們更多考慮程序的效率,而非它的學(xué)習(xí)難度。除了硬件上的困難外蚜迅,ABC語(yǔ)言的設(shè)計(jì)也存在一些致命的問(wèn)題: 可拓展性差舵匾。ABC語(yǔ)言不是模塊化語(yǔ)言。如果想在ABC語(yǔ)言中增加功能谁不,比如對(duì)圖形化的支持坐梯,就必須改動(dòng)很多地方。 不能直接進(jìn)行IO刹帕。ABC語(yǔ)言不能直接操作文件系統(tǒng)吵血。盡管你可以通過(guò)諸如文本流的方式導(dǎo)入數(shù)據(jù),但ABC無(wú)法直接讀寫(xiě)文 件偷溺。輸入輸出的困難對(duì)于計(jì)算機(jī)語(yǔ)言來(lái)說(shuō)是致命的蹋辅。你能想像一個(gè)打不開(kāi)車(chē)門(mén)的跑車(chē)么? 過(guò)度革新挫掏。ABC用自然語(yǔ)言的方式來(lái)表達(dá)程序的意義侦另,比如上面程序中的HOW TO 。然而對(duì)于程序員來(lái)說(shuō)尉共,他們更習(xí)慣 用function或者define來(lái)定義一個(gè)函數(shù)褒傅。同樣,程序員更習(xí)慣用等號(hào)來(lái)分配變量袄友。盡管ABC語(yǔ)言很特別殿托,但學(xué)習(xí)難度 也很大。 傳播困難剧蚣。ABC編譯器很大支竹,必須被保存在磁帶上。當(dāng)時(shí)Guido在訪問(wèn)的時(shí)候鸠按,就必須有一個(gè)大磁帶來(lái)給別人安裝ABC編 譯器礼搁。 這樣,ABC語(yǔ)言就很難快速傳播待诅。
1989年叹坦,為了打發(fā)圣誕節(jié)假期,Guido開(kāi)始寫(xiě)Python語(yǔ)言的編譯器卑雁。Python這個(gè)名字募书,來(lái)自Guido所摯愛(ài)的電視劇Monty Python's Flying Circus。他希望這個(gè)新的叫做Python的語(yǔ)言测蹲,能符合他的理想:創(chuàng)造一種C和shell之間莹捡,功能全面,易學(xué)易用扣甲,可拓展的語(yǔ)言篮赢。Guido作為一個(gè)語(yǔ)言設(shè)計(jì)愛(ài)好者齿椅,已經(jīng)有過(guò)設(shè)計(jì)語(yǔ)言的嘗試。這一次启泣,也不過(guò)是一次純粹的hacking行為涣脚。
1.2.3 Python 的誕生
1991年,第一個(gè)Python編譯器誕生寥茫。它是用C語(yǔ)言實(shí)現(xiàn)的遣蚀,并能夠調(diào)用C語(yǔ)言的庫(kù)文件。
從一出生纱耻,Python已經(jīng)具有了 :類(lèi)芭梯,函數(shù),異常處理弄喘,包含表和詞典在內(nèi)的核心數(shù)據(jù)類(lèi)型玖喘,以及模塊為基礎(chǔ)的拓展系統(tǒng)。
Python語(yǔ)法很多來(lái)自C蘑志,但又受到ABC語(yǔ)言的強(qiáng)烈影響累奈。來(lái)自ABC語(yǔ)言的一些規(guī)定直到今天還富有爭(zhēng)議,比如強(qiáng)制縮進(jìn)急但。 但這些語(yǔ)法規(guī)定讓Python容易讀费尽。
另一方面,Python聰明的選擇服從一些慣例羊始,特別是C語(yǔ)言的慣例,比如回歸等號(hào)賦值查描。Guido認(rèn)為突委,如果“常識(shí)”上確立的東西,沒(méi)有必要過(guò)度糾結(jié)冬三。 Python從一開(kāi)始就特別在意可拓展性匀油。Python可以在多個(gè)層次上拓展。從高層上勾笆,你可以直接引入. py文件敌蚜。在底層,你可以引用C語(yǔ)言的庫(kù)窝爪。Python程序員可以快速的使用Python寫(xiě). py文件作為拓展模塊弛车。但當(dāng)性能是考慮的重要因素時(shí),Python程序員可以深入底層蒲每,寫(xiě)C程序纷跛,編譯為.so文件引入到Python中使用。Python就好像是使用鋼構(gòu)建房一樣邀杏,先規(guī)定好大的框架贫奠。而程序員可以在此框架下相當(dāng)自由的拓展或更改。
最初的Python完全由Guido本人開(kāi)發(fā)。Python得到Guido同事的歡迎唤崭。他們迅速的反饋使用意見(jiàn)拷恨,并參與到Python的改進(jìn)。Guido和一些同事構(gòu)成Python的核心團(tuán)隊(duì)谢肾。他們將自己大部分的業(yè)余時(shí)間用于hack Python腕侄。隨后,Python拓展到研究所之外勒叠。
Python將許多機(jī)器層面上的細(xì)節(jié)隱藏兜挨,交給編譯器處理,并凸顯出邏輯層面的編程思考眯分。Python程序員可以花更多的時(shí)間用于思考程序的邏輯拌汇,而不是具體的實(shí)現(xiàn)細(xì)節(jié)。這一特征吸引了廣大的程序員弊决,Python開(kāi)始流行噪舀。
1.2.4 時(shí)勢(shì)造英雄
我們不得不暫停我們的Python時(shí)間,轉(zhuǎn)而看一看瞬息萬(wàn)變的計(jì)算機(jī)行業(yè)飘诗。
1990年代初与倡,個(gè)人計(jì)算機(jī)開(kāi)始進(jìn)入普通家庭。
Intel發(fā)布了486處理器昆稿,windows發(fā)布window 3.0開(kāi)始的一系列視窗系統(tǒng)纺座。
計(jì)算機(jī)的性能大大提高。程序員開(kāi)始關(guān)注計(jì)算機(jī)的易用性溉潭,比如圖形化界面净响。
由于計(jì)算機(jī)性能的提高,軟件的世界也開(kāi)始隨之改變喳瓣。
硬件足以滿足許多個(gè)人電腦的需要馋贤。硬件廠商甚至渴望高需求軟件的出現(xiàn),以帶動(dòng)硬件的更新?lián)Q代畏陕。
C++和Java相繼流行配乓。
C++和Java提供了面向?qū)ο蟮木幊谭妒剑约柏S富的對(duì)象庫(kù)惠毁。在犧牲了一定的性能的代價(jià)下犹芹,C++和Java大大提高了程序的產(chǎn)量。語(yǔ)言的易用性被提到一個(gè)新的高度仁讨。我們還記得 羽莺,ABC失敗的一個(gè)重要原因是硬件的性能限制。從這方面說(shuō)洞豁,Python要比ABC幸運(yùn)許多盐固。
另一個(gè)悄然發(fā)生的改變是Internet荒给。1990年代還是個(gè)人電腦的時(shí)代,windows和Intel挾PC以令天下刁卜,盛極一時(shí)志电。盡管Internet為主體的信息革命尚未到來(lái),但許多程序員以及資深計(jì)算機(jī)用戶已經(jīng)在頻繁使用Internet進(jìn)行交流蛔趴,比如使用email和newsgroup挑辆。Internet讓信息交流成本大大下降。
一種新的軟件開(kāi)發(fā)模式開(kāi)始流行:開(kāi)源孝情。程序員利用 業(yè)余時(shí)間進(jìn)行軟件開(kāi)發(fā)鱼蝉,并開(kāi)放源代碼。
1991年箫荡,Linus在comp.os.minix新聞組上發(fā)布了Linux內(nèi)核源代碼魁亦,吸引大批hacker的加入。Linux和GNU相互合作羔挡,最終構(gòu)成了一個(gè)充滿活力的開(kāi)源平臺(tái)洁奈。
硬件性能不是瓶頸,Python又容易使用绞灼,所以許多人開(kāi)始轉(zhuǎn)向Python利术。Guido維護(hù)了一個(gè)maillist,Python用戶就通過(guò)郵件進(jìn)行交流低矮。Python用戶來(lái)自許多領(lǐng)域印叁,有不同的背景,對(duì)Python也有不同的需求军掂。Python相當(dāng)?shù)拈_(kāi)放喉钢,又容易拓展,所以當(dāng)用戶不滿足于現(xiàn)有功能良姆,很容易對(duì)Python進(jìn)行拓展或改造。
隨后幔戏,這些用戶將改動(dòng)發(fā)給Guido玛追,并由Guido決定是否將新的特征加入到Python或者標(biāo)準(zhǔn)庫(kù)中。如果代碼能被納入Python自身或者標(biāo)準(zhǔn)庫(kù)闲延,這將極大的榮譽(yù)痊剖。由于Guido至高無(wú)上的決定權(quán),他因此被稱(chēng)為“終身的仁慈獨(dú)裁者”垒玲。 Python被稱(chēng)為“Battery Included”陆馁,是說(shuō)它以及其標(biāo)準(zhǔn)庫(kù)的功能強(qiáng)大。
并且因?yàn)檫@些是整個(gè)社區(qū)貢獻(xiàn)合愈,同時(shí)Python的開(kāi)發(fā)者又來(lái)自不同領(lǐng)域叮贩,他們將不同領(lǐng)域的優(yōu)點(diǎn)帶給Python击狮。比如Python標(biāo)準(zhǔn)庫(kù)中的正則表達(dá)是參考Perl,而lambda, map, filter, reduce等函數(shù)參考了Lisp益老。Python本身的一些功能以及大部分的標(biāo)準(zhǔn)庫(kù)來(lái)自于社區(qū)彪蓬。Python的社 區(qū)不斷擴(kuò)大,進(jìn)而擁有了自己的newsgroup捺萌,網(wǎng)站档冬,以及基金。
從Python 2.0開(kāi)始桃纯,Python也從maillist的開(kāi)發(fā)方式酷誓,轉(zhuǎn)為完全開(kāi)源的開(kāi)發(fā)方式。社區(qū)氣氛已經(jīng)形成态坦,工作被整個(gè)社區(qū)分擔(dān)盐数,Python也獲得了更加高速的發(fā)展。 到今天驮配,Python的框架已經(jīng)確立娘扩。Python語(yǔ)言以對(duì)象為核心組織代碼,支持多種編程范式壮锻,采用動(dòng)態(tài)類(lèi)型琐旁,自動(dòng)進(jìn)行內(nèi)存回收。Python支持解釋運(yùn)行猜绣,并能調(diào)用C庫(kù)進(jìn)行拓展灰殴。Python有強(qiáng)大的標(biāo)準(zhǔn)庫(kù)。由于標(biāo)準(zhǔn)庫(kù)的體系已經(jīng)穩(wěn)定掰邢,所以Python的生態(tài)系統(tǒng)開(kāi)始拓展到第三方包牺陶。這些包,如Django辣之、web.py掰伸、wxpython、numpy怀估、matplotlib狮鸭、PIL,將Python升級(jí)成了物種豐富的熱帶雨林多搀。
1.2.5 Python 的優(yōu)點(diǎn)
- 簡(jiǎn)單
- Python是一種代表簡(jiǎn)單主義思想的語(yǔ)言歧蕉。閱讀一個(gè)良好的Python程序就感覺(jué)像是在讀英語(yǔ)一樣,盡管這個(gè)英語(yǔ)的要求非常嚴(yán)格康铭!Python的這種偽代碼本質(zhì)是它最大的優(yōu)點(diǎn)之一惯退。它使你能夠?qū)W⒂诮鉀Q問(wèn)題而不是去搞明白語(yǔ)言本身。
- 易學(xué)
- 就如同你即將看到的一樣从藤,Python極其容易上手催跪。前面已經(jīng)提到了锁蠕,Python有極其簡(jiǎn)單的語(yǔ)法。
- 免費(fèi)叠荠、開(kāi)源
- Python是FLOSS(自由/開(kāi)放源碼軟件)之一匿沛。簡(jiǎn)單地說(shuō),你可以自由地發(fā)布這個(gè)軟件的拷貝榛鼎、閱讀它的源代碼逃呼、對(duì)它做改動(dòng)、把它的一部分用于新的自由軟件中者娱。FLOSS是基于一個(gè)團(tuán)體分享知識(shí)的概念抡笼。這是為什么Python如此優(yōu)秀的原因之一——它是由一群希望看到一個(gè)更加優(yōu)秀的Python的人創(chuàng)造并經(jīng)常改進(jìn)著的。
- 高層語(yǔ)言
- 當(dāng)你用Python語(yǔ)言編寫(xiě)程序的時(shí)候黄鳍,你無(wú)需考慮諸如如何管理你的程序使用的內(nèi)存一類(lèi)的底層細(xì)節(jié)推姻。
- 可移植性
- 由于它的開(kāi)源本質(zhì),Python已經(jīng)被移植在許多平臺(tái)上(經(jīng)過(guò)改動(dòng)使它能夠工作在不同平臺(tái)上)框沟。如果你小心地避免使用依賴(lài)于系統(tǒng)的特性藏古,那么你的所有Python程序無(wú)需修改就可以在下述任何平臺(tái)上面運(yùn)行。
- 這些平臺(tái)包括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開(kāi)發(fā)的Android平臺(tái)码党!
- 解釋性
- 這一點(diǎn)需要一些解釋德崭。一個(gè)用編譯性語(yǔ)言比如C或C++寫(xiě)的程序可以從源文件(即C或C++語(yǔ)言)轉(zhuǎn)換到一個(gè)你的計(jì)算機(jī)使用的語(yǔ)言(二進(jìn)制代碼,即0和1)揖盘。這個(gè)過(guò)程通過(guò)編譯器和不同的標(biāo)記眉厨、選項(xiàng)完成。當(dāng)你運(yùn)行你的程序的時(shí)候兽狭,連接/轉(zhuǎn)載器軟件把你的程序從硬盤(pán)復(fù)制到內(nèi)存中并且運(yùn)行憾股。而Python語(yǔ)言寫(xiě)的程序不需要編譯成二進(jìn)制代碼。你可以直接從源代碼運(yùn)行程序箕慧。
- 在計(jì)算機(jī)內(nèi)部服球,Python解釋器把源代碼轉(zhuǎn)換成稱(chēng)為字節(jié)碼的中間形式,然后再把它翻譯成計(jì)算機(jī)使用的機(jī)器語(yǔ)言并運(yùn)行颠焦。事實(shí)上斩熊,由于你不再需要擔(dān)心如何編譯程序,如何確保連接轉(zhuǎn)載正確的庫(kù)等等伐庭,所有這一切使得使用Python更加簡(jiǎn)單粉渠。由于你只需要把你的Python程序拷貝到另外一臺(tái)計(jì)算機(jī)上,它就可以工作了圾另,這也使得你的Python程序更加易于移植霸株。
- 面向?qū)ο?
- Python既支持面向過(guò)程的編程也支持面向?qū)ο蟮木幊獭T凇懊嫦蜻^(guò)程”的語(yǔ)言中盯捌,程序是由過(guò)程或僅僅是可重用代碼的函數(shù)構(gòu)建起來(lái)的淳衙。在“面向?qū)ο蟆钡恼Z(yǔ)言中,程序是由數(shù)據(jù)和功能組合而成的對(duì)象構(gòu)建起來(lái)的饺著。與其他主要的語(yǔ)言如C++和Java相比箫攀,Python以一種非常強(qiáng)大又簡(jiǎn)單的方式實(shí)現(xiàn)面向?qū)ο缶幊獭?/li>
- 可擴(kuò)展性
- 如果你需要你的一段關(guān)鍵代碼運(yùn)行得更快或者希望某些算法不公開(kāi),你可以把你的部分程序用C或C++編寫(xiě)幼衰,然后在你的Python程序中使用它們靴跛。
- 豐富的庫(kù)
- Python標(biāo)準(zhǔn)庫(kù)確實(shí)很龐大。它可以幫助你處理各種工作渡嚣,包括正則表達(dá)式梢睛、文檔生成、單元測(cè)試识椰、線程绝葡、數(shù)據(jù)庫(kù)、網(wǎng)頁(yè)瀏覽器腹鹉、CGI藏畅、FTP、電子郵件功咒、XML愉阎、XML-RPC绞蹦、HTML、WAV文件榜旦、密碼系統(tǒng)幽七、GUI(圖形用戶界面)、Tk和其他與系統(tǒng)有關(guān)的操作溅呢。
- 記住澡屡,只要安裝了Python,所有這些功能都是可用的藕届。這被稱(chēng)作Python的“功能齊全”理念挪蹭。除了標(biāo)準(zhǔn)庫(kù)以外,還有許多其他高質(zhì)量的庫(kù)休偶,如wxPython梁厉、Twisted和Python圖像庫(kù)等等。
- 規(guī)范的代碼
- Python采用強(qiáng)制縮進(jìn)的方式使得代碼具有極佳的可讀性踏兜。
1.2.6 Python 的缺點(diǎn)
- 運(yùn)行速度词顾,有速度要求的話,用C++改寫(xiě)關(guān)鍵部分吧碱妆。
- Python是解釋型語(yǔ)言肉盹,你的代碼在執(zhí)行時(shí)會(huì)一行一行地翻譯成CPU能理解的機(jī)器碼,這個(gè)翻譯過(guò)程非常耗時(shí)疹尾,所以很慢上忍。而C程序是運(yùn)行前直接編譯成CPU能執(zhí)行的機(jī)器碼,所以非衬杀荆快窍蓝。
- 但是大量的應(yīng)用程序不需要這么快的運(yùn)行速度,因?yàn)橛脩舾靖杏X(jué)不出來(lái)繁成。例如開(kāi)發(fā)一個(gè)下載MP3的網(wǎng)絡(luò)應(yīng)用程序吓笙,C程序的運(yùn)行時(shí)間需要0.001秒,而Python程序的運(yùn)行時(shí)間需要0.1秒巾腕,慢了100倍面睛,但由于網(wǎng)絡(luò)更慢,需要等待1秒尊搬,你想叁鉴,用戶能感覺(jué)到1.001秒和1.1秒的區(qū)別嗎?這就好比F1賽車(chē)和普通的出租車(chē)在北京三環(huán)路上行駛的道理一樣佛寿,雖然F1賽車(chē)?yán)碚摃r(shí)速高達(dá)400公里幌墓,但由于三環(huán)路堵車(chē)的時(shí)速只有20公里,因此,作為乘客克锣,你感覺(jué)的時(shí)速永遠(yuǎn)是20公里。
- 國(guó)內(nèi)市場(chǎng)較星怀ぁ(國(guó)內(nèi)以python來(lái)做主要開(kāi)發(fā)的袭祟,目前只有一些web2.0公司)。但時(shí)間推移捞附,目前很多國(guó)內(nèi)軟件公司巾乳,尤其是游戲公司,也開(kāi)始規(guī)模使用他鸟召。
- 中文資料匱乏(好的python中文資料屈指可數(shù))胆绊。托社區(qū)的福,有幾本優(yōu)秀的教材已經(jīng)被翻譯了欧募,但入門(mén)級(jí)教材多压状,高級(jí)內(nèi)容還是只能看英語(yǔ)版。
- 構(gòu)架選擇太多(沒(méi)有像C#這樣的官方.net構(gòu)架跟继,也沒(méi)有像ruby由于歷史較短种冬,構(gòu)架開(kāi)發(fā)的相對(duì)集中。Ruby on Rails 構(gòu)架開(kāi)發(fā)中小型web程序天下無(wú)敵)舔糖。不過(guò)這也從另一個(gè)側(cè)面說(shuō)明娱两,python比較優(yōu)秀,吸引的人才多金吗,項(xiàng)目也多十兢。
- 代碼不能加密。
- 如果要發(fā)布你的Python程序摇庙,實(shí)際上就是發(fā)布源代碼旱物,這一點(diǎn)跟C語(yǔ)言不同,C語(yǔ)言不用發(fā)布源代碼跟匆,只需要把編譯后的機(jī)器碼(也就是你在Windows上常見(jiàn)的xxx.exe文件)發(fā)布出去异袄。要從機(jī)器碼反推出C代碼是不可能的,所以玛臂,凡是編譯型的語(yǔ)言烤蜕,都沒(méi)有這個(gè)問(wèn)題,而解釋型的語(yǔ)言迹冤,則必須把源碼發(fā)布出去讽营。
- 這個(gè)缺點(diǎn)僅限于你要編寫(xiě)的軟件需要賣(mài)給別人掙錢(qián)的時(shí)候。好消息是目前的互聯(lián)網(wǎng)時(shí)代泡徙,靠賣(mài)軟件授權(quán)的商業(yè)模式越來(lái)越少了橱鹏,靠網(wǎng)站和移動(dòng)應(yīng)用賣(mài)服務(wù)的模式越來(lái)越多了,后一種模式不需要把源碼給別人。
- 再說(shuō)了莉兰,現(xiàn)在如火如荼的開(kāi)源運(yùn)動(dòng)和互聯(lián)網(wǎng)自由開(kāi)放的精神是一致的挑围,互聯(lián)網(wǎng)上有無(wú)數(shù)非常優(yōu)秀的像Linux一樣的開(kāi)源代碼,我們千萬(wàn)不要高估自己寫(xiě)的代碼真的有非常大的“商業(yè)價(jià)值”糖荒。那些大公司的代碼不愿意開(kāi)放的更重要的原因是代碼寫(xiě)得太爛了杉辙,一旦開(kāi)源,就沒(méi)人敢用他們的產(chǎn)品了捶朵。
1.2.7 Python 的應(yīng)用場(chǎng)景
- Web應(yīng)用開(kāi)發(fā)
- Python經(jīng)常被用于Web開(kāi)發(fā)蜘矢。比如,通過(guò)mod_wsgi模塊综看,Apache可以運(yùn)行用Python編寫(xiě)的Web程序品腹。
- Python定義了WSGI標(biāo)準(zhǔn)應(yīng)用接口來(lái)協(xié)調(diào)Http服務(wù)器與基于Python的Web程序之間的通信。
- 一些Web框架红碑,如Django,TurboGears,web2py,Zope等舞吭,可以讓程序員輕松地開(kāi)發(fā)和管理復(fù)雜的Web程序。
- 操作系統(tǒng)管理句喷、服務(wù)器運(yùn)維的自動(dòng)化腳本
- 在很多操作系統(tǒng)里镣典,Python是標(biāo)準(zhǔn)的系統(tǒng)組件。 大多數(shù)Linux發(fā)行版以及NetBSD唾琼、OpenBSD和Mac OS X都集成了Python兄春,可以在終端下直接運(yùn)行Python。
- 有一些Linux發(fā)行版的安裝器使用Python語(yǔ)言編寫(xiě)锡溯,比如Ubuntu的Ubiquity安裝器,Red Hat Linux和Fedora的Anaconda安裝器赶舆。Gentoo Linux使用Python來(lái)編寫(xiě)它的Portage包管理系統(tǒng)。
- Python標(biāo)準(zhǔn)庫(kù)包含了多個(gè)調(diào)用操作系統(tǒng)功能的庫(kù)祭饭。通過(guò)pywin32這個(gè)第三方軟件 包芜茵,Python能夠訪問(wèn)Windows的COM服務(wù)及其它Windows API。使用IronPython倡蝙,Python程序能夠直接調(diào)用.Net Framework九串。
- 一般說(shuō)來(lái),Python編寫(xiě)的系統(tǒng)管理腳本在可讀性寺鸥、性能猪钮、代碼重用度、擴(kuò)展性幾方面都優(yōu)于普通的shell腳本胆建。
- 科學(xué)計(jì)算
- NumPy,SciPy,Matplotlib可以讓Python程序員編寫(xiě)科學(xué)計(jì)算程序烤低。
- 桌面軟件
- PyQt、PySide笆载、wxPython扑馁、PyGTK是Python快速開(kāi)發(fā)桌面應(yīng)用程序的利器涯呻。
- 服務(wù)器軟件(網(wǎng)絡(luò)軟件)
- Python對(duì)于各種網(wǎng)絡(luò)協(xié)議的支持很完善,因此經(jīng)常被用于編寫(xiě)服務(wù)器軟件腻要、網(wǎng)絡(luò)爬蟲(chóng)复罐。
- 第三方庫(kù)Twisted支持異步網(wǎng)絡(luò)編程和多數(shù)標(biāo)準(zhǔn)的網(wǎng)絡(luò)協(xié)議(包含客戶端和服務(wù)器),并且提供了多種工具雄家,被廣泛用于編寫(xiě)高性能的服務(wù)器軟件市栗。
- 游戲
- 很多游戲使用C++編寫(xiě)圖形顯示等高性能模塊,而使用Python或者Lua編寫(xiě)游戲的邏輯咳短、服務(wù)器。
- 相較于Python蛛淋,Lua的功能更簡(jiǎn)單咙好、體積更小褐荷;而Python則支持更多的特性和數(shù)據(jù)類(lèi)型勾效。
- 構(gòu)思實(shí)現(xiàn),產(chǎn)品早期原型和迭代
- YouTube叛甫、Google层宫、Yahoo!、NASA都在內(nèi)部大量地使用Python其监。