1.1 Python的歷史
1.1.1 Python的誕生
Python是一門高級(jí)計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言儡嘶,1989年,荷蘭的Guido von Rossum創(chuàng)造了它砂豌。Guido是是一個(gè)牛人腌闯,1982年蔽午,他從阿姆斯特丹大學(xué)獲得了數(shù)學(xué)和計(jì)算機(jī)碩士學(xué)位驮吱,因此他可以算是一位數(shù)學(xué)家茧妒,不過他更享受使用計(jì)算機(jī)解決問題的感覺。Python只是由Guido的一次hacking產(chǎn)生的左冬,1989年圣誕節(jié)假期桐筏,早就萌發(fā)了設(shè)計(jì)一門好用的高級(jí)語(yǔ)言的想法的Guido,放棄了休息拇砰,全身心的投入到了設(shè)計(jì)新語(yǔ)言的活動(dòng)中去梅忌,結(jié)果產(chǎn)生了世界上少有的幾門最優(yōu)美、最易用除破、最簡(jiǎn)潔的高級(jí)程序設(shè)計(jì)語(yǔ)言之一——Python語(yǔ)言牧氮。
我們說過,Guido是一個(gè)牛人瑰枫,他在設(shè)計(jì)Python語(yǔ)言之前踱葛,已經(jīng)接觸并使用過Pascal、C光坝、Fortran等高級(jí)語(yǔ)言尸诽,這些語(yǔ)言各有強(qiáng)大的功能,能夠很好地解決問題盯另,Guido也能很熟練地使用它們性含,他為什么還要"多此一舉"地設(shè)計(jì)一門新語(yǔ)言呢?
這是因?yàn)椋鲜鲞@些語(yǔ)言都是為了充分利用計(jì)算設(shè)備而設(shè)計(jì)的鸳惯,因?yàn)槟菚r(shí)的計(jì)算機(jī)CPU不夠快商蕴,內(nèi)存不夠大,這些語(yǔ)言設(shè)計(jì)的主要目標(biāo)之一是充分利用計(jì)算機(jī)有限的資源悲敷,讓程序運(yùn)行得更快究恤,占用的內(nèi)存空間更小,雖然也把人類的可讀性和易用性作為一個(gè)目標(biāo)后德,但后者仍不夠突出部宿,結(jié)果人類不能用最簡(jiǎn)潔的方式去書寫計(jì)算機(jī)程序,寫出來的程序既長(zhǎng)又不好懂瓢湃。舉個(gè)生活中的例子進(jìn)行類比: 假設(shè)初中生理张、小學(xué)生和幼兒園小朋友都解一道數(shù)學(xué)題:
雞兔同籠,共有頭48個(gè),腳132只,求雞和兔各有多少只?
初中生解這道題的方法是:
設(shè)有雞x只,兔y只绵患,則 # 對(duì)應(yīng)到計(jì)算機(jī)編程雾叭,這是編寫程序代碼的部分
x+y=48 # 容易理解,容易編寫落蝙,簡(jiǎn)明
2x+4y=132
解這個(gè)二元一次方程組织狐,得: # 這是程序運(yùn)行進(jìn)行計(jì)算的部分
x=30, y=18
小學(xué)生解這道題的方法是:
1. 將雞暂幼、兔都剪去2只腳,還剩幾只腳: 132-48*2 # 對(duì)應(yīng)到計(jì)算機(jī)編程,這是編寫程序
# 代碼的部分移迫,不容易理解
2. 上式計(jì)算結(jié)果是=36 # 這是程序運(yùn)行進(jìn)行計(jì)算的部分
3. 剩下的腳是兔子的腳旺嬉,兔子有幾只: 36/2 # 對(duì)應(yīng)到計(jì)算機(jī)編程,這是編寫程序
# 代碼的部分厨埋,不容易理解
4. 上式計(jì)算結(jié)果是=18
5. 雞有多少只: 48-18=30只
幼兒園小朋友解這道數(shù)學(xué)題時(shí)邪媳,需要家長(zhǎng)手把手地教他們做:
第一步: 48個(gè)頭中有雞的頭,也有兔子的頭
第二步: 132只腳中有雞的腳荡陷,也有兔子的腳
第三步: 每只雞有2只腳雨效,每只兔子有4只腳
...
很多步之后:
雞: 30只,兔: 18只
在上面這個(gè)例子中废赞,我們可以看到初中生徽龟、小學(xué)生、幼兒園小朋友之間解同一個(gè)數(shù)學(xué)問題的區(qū)別首先是表達(dá)方式上的區(qū)別蛹头,可以把他們類比成Python(初中生)顿肺、C/Fortran/Pascal(小學(xué)生)戏溺、匯編語(yǔ)言(幼兒園小朋友)之間的區(qū)別渣蜗,越是高級(jí)的語(yǔ)言,解題方法的表達(dá)方式就越簡(jiǎn)潔旷祸、越清晰耕拷、越容易理解,所需的解題步驟(代碼量)就越少托享。
Guido創(chuàng)造Python時(shí)想解決的是類似的問題骚烧,C/Fortran/Pascal甚至匯編語(yǔ)言的能力不可謂不強(qiáng)大,就像一個(gè)訓(xùn)練有素的小學(xué)生可以解決很多生活中的實(shí)際問題一樣闰围,但是它們的缺點(diǎn)是需要下達(dá)的指令(編寫的代碼)太多赃绊,而且不容易直觀地理解。舉個(gè)例子羡榴,常常一行Python代碼可以抵得上十幾行C語(yǔ)言代碼碧查。
先看Python代碼
# 代碼1.1 printStr.py ,這是Python代碼,這段代碼和下面的C代碼作用相同
s1="Hello,"
s2="World!"
s3=s1+s2
print(s3)
代碼1.1 的輸出如下所示
$ python3 printStr.py
$ Hello,World!
說明: 本文中的Python代碼假定是在類Unix系統(tǒng)下運(yùn)行的校仑,$是命令提示符
再來看看C代碼
// 代碼1.2 printStr.c 這是C代碼
#include <malloc>
#include <stdlib>
#include <stdin>
int strlen(char str[])
{
int len=0;
char *p=0;
for(p=str;p!=NULL;p++){
len++;
}
return len;
}
int main(void){
char s1[]="Hello,";
char s2[]="World!";
char * s3=(char *)malloc(sizeof(char)*(strlen(s1)+strlen(s2)+1));
char *p=0;
for(p=s1;p!=NULL;p++){
*s3++=*p;
}
for(p=s2;p!=NULL;p++){
*s3++=*p;
}
s3='\0';
s3=s3-strlen(s3);
printf("%s\n", s3);
}
代碼1.2的輸出如下:
$ gcc printStr.c -o printStr
$ ./printStr
$ Hello,World!
代碼1.1和代碼1.2完成的是相同的功能忠售,在C語(yǔ)言中使用了29行代碼實(shí)現(xiàn),而且代碼的含義并不直觀迄沫,反觀Python代碼稻扬,它只用了4行代碼,簡(jiǎn)潔明快羊瘩,容易理解泰佳,而代碼量非常少盼砍,這就是Guido Von Rossum想要實(shí)現(xiàn)的效果。
1.1.2 Python的主要版本
Python歷史上經(jīng)歷了0.X逝她、1.X衬廷、2.X和3.X等4個(gè)大的主要版本,其中的X表示小版本號(hào)汽绢,比如Python2就有2.0吗跋、2.4、2.5宁昭、2.6跌宛、2.7等版本。Python的主要版本誕生時(shí)間如表1.1所示』蹋現(xiàn)在世界上應(yīng)用的Python程序疆拘,使用的主要是Python 2.X和Python 3.X版本,使用這兩種Python大版本的應(yīng)用程序是并存的寂曹,但Python 2和Python 3并不兼容哎迄,這是由于在開發(fā)Python 2時(shí),計(jì)算機(jī)世界的很多新技術(shù)還未出現(xiàn)隆圆,Python 3提供了對(duì)這些新技術(shù)的支持漱挚,因此其不與Python 2 兼容。Python 2 將在 2020年停止支持渺氧,不再進(jìn)行開發(fā)旨涝。今后應(yīng)該主要學(xué)習(xí)和使用Python 3。不過侣背,由于Python 2和Python 3的設(shè)計(jì)理念是相同的白华,而且大部分內(nèi)容也相同,因此贩耐,從Python2開始學(xué)習(xí)也可以平滑地轉(zhuǎn)換到Python 3上弧腥。
Python版本號(hào) | 誕生時(shí)間 |
---|---|
世界上首個(gè)Python版本 | 1989年圣誕節(jié) |
第一個(gè)公開發(fā)行的Python版本 | 1991年 |
Python 1.0 | 1994-01 |
Python 2.0 | 2000-10-16 |
Python 2.4 | 2004-11-30 |
Python 2.5 | 2006-09-19 |
Python 2.6 | 2008-10-01 |
Python 2.7 | 2010-07-03 |
Python 3.0 | 2008-12-03 |
Python 3.1 | 2009-06-27 |
Python 3.2 | 2011-02-20 |
Python 3.3 | 2012-09-29 |
Python 3.4 | 2014-03-16 |
Python 3.5 | 2015-09-13 |
Python 3.6 | 2016-12-23 |
1.2 Python是一種解釋型(腳本)語(yǔ)言
編程語(yǔ)言可以分成解釋型和編譯型兩種。實(shí)際上潮太,對(duì)于高級(jí)語(yǔ)言來說管搪,我們編寫的代碼都是為了更好地完成計(jì)算任務(wù)及讓人們更好的編寫和理解代碼而設(shè)計(jì)給人們使用的,因此編寫代碼這個(gè)步驟是面向人類的消别,也就是人類可讀寫的抛蚤。另一方面,還需要讓計(jì)算機(jī)理解和運(yùn)行程序寻狂,而計(jì)算機(jī)只理解0/1組成的代碼岁经,它并不能直接運(yùn)行人們編寫的高級(jí)語(yǔ)言代碼。如何解決這個(gè)問題呢蛇券?這就需要高級(jí)語(yǔ)言的解釋器或編譯器大顯身手了缀壤,這兩個(gè)東西都是將高級(jí)計(jì)算機(jī)語(yǔ)言翻譯成機(jī)器可執(zhí)行的代碼的工具樊拓。顯然,使用解釋器的就是解釋型語(yǔ)言塘慕,使用編譯器的就是編譯型語(yǔ)言了筋夏。二者的區(qū)別是解釋型語(yǔ)言運(yùn)行時(shí),形式上是直接運(yùn)行高級(jí)語(yǔ)言代碼图呢,解釋器在后臺(tái)逐條對(duì)高級(jí)語(yǔ)言代碼進(jìn)行解釋運(yùn)行条篷,多次運(yùn)行需要多次解釋;而編譯型語(yǔ)言的高級(jí)語(yǔ)言代碼一旦編寫除錯(cuò)完成蛤织,就使用編譯器對(duì)代碼進(jìn)行一次性地編譯赴叹,翻譯成機(jī)器可以執(zhí)行的代碼,供以后反復(fù)運(yùn)行指蚜,一次編譯可以多次運(yùn)行乞巧。編譯型語(yǔ)言的一個(gè)著名的例子就是C語(yǔ)言。
由于解釋型語(yǔ)言運(yùn)行時(shí)摊鸡,同時(shí)要進(jìn)行解釋和運(yùn)行的任務(wù)绽媒,而編譯型語(yǔ)言的編譯過程提前完成了,所以解釋型語(yǔ)言通常比編譯型語(yǔ)言的程序運(yùn)行速度慢免猾,而且慢得多是辕。
解釋型語(yǔ)言由于直接運(yùn)行高級(jí)語(yǔ)言代碼,像電影腳本那樣掸刊,按照文件預(yù)定的步驟免糕,一步一步完成處理任務(wù),所以也稱為腳本語(yǔ)言忧侧。
Python是一種解釋型(腳本)語(yǔ)言。它自從創(chuàng)生以來就風(fēng)靡了世界牌芋,取得了很大的成功蚓炬。為什么Python運(yùn)行速度慢,還能做到這樣的成功呢? 這就要從它的特點(diǎn)說起了躺屁。
1.3 Python的特點(diǎn)
1.3.1 Python代碼易讀肯夏、易寫、易懂犀暑、易調(diào)驯击、易改
Python的設(shè)計(jì)理念是"優(yōu)雅、簡(jiǎn)明耐亏、高效"徊都,我們?cè)谇懊嫠e的例子代碼1.1中可以充分地看到上述這一特點(diǎn)。由于Python是一種解釋型語(yǔ)言的特點(diǎn)广辰,執(zhí)行它不需要對(duì)其進(jìn)行編譯暇矫,代碼執(zhí)行過程中發(fā)現(xiàn)了問題主之,可以直接修改代碼進(jìn)行調(diào)試,而Python解釋器提供的錯(cuò)誤排查機(jī)制李根,增強(qiáng)了調(diào)試除錯(cuò)的功能槽奕,因此實(shí)際使用Python時(shí)感覺十分流暢,這種體驗(yàn)非常容易讓人上癮房轿。
1.3.2 Python功能強(qiáng)大粤攒、易擴(kuò)展、有豐富的專業(yè)庫(kù)
另外囱持,一方面Python好像是一個(gè)工具箱琼讽,官方Python語(yǔ)言及其標(biāo)準(zhǔn)庫(kù)就自帶很多好用的工具,如它的字符串處理能力洪唐,如列表钻蹬、元組、字典等數(shù)據(jù)結(jié)構(gòu)凭需,如列表解析问欠、函數(shù)的可變參數(shù)傳遞和多值返回、如動(dòng)態(tài)數(shù)據(jù)類型和自動(dòng)垃圾回收機(jī)制等內(nèi)容粒蜈。
同時(shí)顺献,其他組織和個(gè)人還可以為Python開發(fā)實(shí)現(xiàn)某項(xiàng)通用功能的軟件庫(kù),通過"第三方"擴(kuò)展模塊的方式為Python提供"擴(kuò)展的工具箱"枯怖。
由于Python本身十分強(qiáng)大注整,并且存在豐富的軟件庫(kù),每個(gè)想要實(shí)現(xiàn)某種特定任務(wù)的人度硝,都可以找到合適的軟件包進(jìn)行工作肿轨,而且由于軟件包常常十分強(qiáng)大,非常適合新手完成用其他語(yǔ)言很難完成的任務(wù)蕊程,用句俗話說 椒袍,就是非常容易上手。
進(jìn)一步說藻茂,Python用戶還可以在Python官方語(yǔ)言和豐富的第三方庫(kù)的基礎(chǔ)上自定義自己的"實(shí)用工具"驹暑,來增加自己可用的工具。因此辨赐,可以說Python具有靈活的擴(kuò)展性优俘,在各個(gè)行業(yè)領(lǐng)域都具有豐富的軟件庫(kù)可供使用。Python非常適用于具有各種專業(yè)背景的人士編寫計(jì)算機(jī)程序完成專業(yè)領(lǐng)域的運(yùn)算任務(wù)掀序。
表1.2列出了一些酷炫的Python軟件庫(kù):
軟件庫(kù) | 功能 |
---|---|
NLTK | 人類語(yǔ)言處理 |
jieba | 中文分詞工具 |
SnowNLP | 一個(gè)處理中文文本的庫(kù) |
pyocr | 光學(xué)字符識(shí)別(把掃描的文字圖像轉(zhuǎn)換成字符串) |
moviepy | 一個(gè)用來進(jìn)行基于腳本的視頻編輯模塊帆焕,適用于多種格式,包括動(dòng)圖 GIFs |
GeoDjango | 世界級(jí)地理圖形 web 框架 |
django-shop | 一個(gè)基于 Django 的店鋪系統(tǒng) |
Cartridge | 一個(gè)基于 Mezzanine 構(gòu)建的購(gòu)物車應(yīng)用 |
newspaper | 使用 Python 進(jìn)行新聞提取森枪,文章提取以及內(nèi)容策展 |
PyCrypto | Python 密碼學(xué)工具箱 |
Tkinter | Tkinter 是 Python GUI 的一個(gè)事實(shí)標(biāo)準(zhǔn)庫(kù) |
Panda3D | 由迪士尼開發(fā)的 3D 游戲引擎视搏,并由卡內(nèi)基梅隆娛樂技術(shù)中心負(fù)責(zé)維護(hù)审孽。使用C++編寫, 針對(duì) Python 進(jìn)行了完全的封裝 |
PyOgre | Ogre 3D 渲染引擎的 Python 綁定,可以用來開發(fā)游戲和仿真程序等任何 3D 應(yīng)用 |
astropy | 一個(gè)天文學(xué) Python 庫(kù) |
bccb | 生物分析相關(guān)代碼集合 |
Neupy | 執(zhí)行和測(cè)試各種不同的人工神經(jīng)網(wǎng)絡(luò)算法 |
NumPy | 使用 Python 進(jìn)行科學(xué)計(jì)算的基礎(chǔ)包 |
ino | 操作Arduino的命令行工具 |
Pyro | Python 機(jī)器人編程庫(kù) |
1.3.3 Python代碼簡(jiǎn)明浑娜,書寫效率高
Python語(yǔ)言本身設(shè)計(jì)得簡(jiǎn)明而高效佑力,而且由于各種強(qiáng)大的Python軟件庫(kù)的存在,它們已封裝了各種強(qiáng)大的功能筋遭,引入了這些庫(kù)之后打颤,實(shí)現(xiàn)專業(yè)領(lǐng)域的復(fù)雜任務(wù)常常只需數(shù)行甚至一行核心代碼就可解決問題,因此漓滔,Python代碼常常非常簡(jiǎn)明编饺,而且書寫效率相當(dāng)高,這一點(diǎn)响驴,在前面的代碼1-1已經(jīng)見識(shí)到了透且。