官术网_书友最值得收藏!

1.1 認(rèn)識Python

1.1.1 Python的發(fā)展歷程

Python的創(chuàng)始人為荷蘭的Guido van Rossum(見圖1-1)。1989年,Guido為了打發(fā)圣誕節(jié)的無趣,決心開發(fā)一個新的腳本解釋程序,作為ABC語言的一種繼承。之所以選中Python作為該編程語言的名字,是因為他是一個叫Monty Python喜劇團(tuán)體的愛好者。

圖1-1 Python創(chuàng)始人

ABC是由Guido參加設(shè)計的一種教學(xué)語言。就Guido本人看來,ABC這種語言非常優(yōu)美和強(qiáng)大,是專門為非專業(yè)程序員設(shè)計的。但是ABC語言并沒有成功,究其原因,Guido認(rèn)為是其非開放造成的。Guido決心在Python中避免這一錯誤,同時,他還想實現(xiàn)在ABC中閃現(xiàn)過但未曾實現(xiàn)的東西,就這樣,Python在Guido手中誕生了??梢哉f,Python是從ABC發(fā)展起來的,主要是受到了Modula-3的影響,并且結(jié)合了Unix shell和C的習(xí)慣。

1991年,Python第一個公開發(fā)行版本發(fā)行,它是一種面向?qū)ο蟮慕忉屝陀嬎銠C(jī)程序設(shè)計語言,它是使用C語言實現(xiàn)的,并且能夠調(diào)用C語言的庫文件。從一出生,Python已經(jīng)具有了類、函數(shù)、異常處理,包含列表和字典在內(nèi)的核心數(shù)據(jù)類型,以及模塊為基礎(chǔ)的拓展系統(tǒng)。

最初的Python完全由Guido本人開發(fā)。Python得到Guido同事的歡迎,他們迅速地反饋使用意見,并參與到Python的改進(jìn)中。Guido和一些同事構(gòu)成Python的核心團(tuán)隊,他們將自己大部分的業(yè)余時間用于發(fā)掘Python。隨后,Python拓展到研究所之外。Python將許多機(jī)器層面上的細(xì)節(jié)隱藏,交給編譯器處理,并凸顯出邏輯層面的編程思考。Python程序員可以花更多的時間用于思考程序的邏輯,而不是具體的實現(xiàn)細(xì)節(jié),這一特征吸引了廣大的程序員,Python開始流行。2011年1月,Python贏得TIOBE編程語言排行榜的年度語言。

1.1.2 Python的特點

Python具有以下顯著的特點。

(1)簡單易學(xué)

Python是一種代表簡單主義思想的語言。閱讀一個良好的Python程序就感覺像是在讀英語段落一樣,盡管這個英語段落的語法要求非常嚴(yán)格。Python最大的優(yōu)點之一是具有偽代碼的本質(zhì),它使我們在開發(fā)Python程序時,專注的是解決問題,而不是搞明白語言本身。

(2)開源

Python是FLOSS(自由/開放源碼軟件)之一。簡單地說,你可以自由地發(fā)布這個軟件的拷貝,閱讀它的源代碼,對它做改動,把它的一部分用于新的自由軟件中。FLOSS 是基于一個團(tuán)體分享知識的概念,這是為什么Python如此優(yōu)秀的原因之一——它是由一群希望看到一個更加優(yōu)秀的Python的人創(chuàng)造并經(jīng)常改進(jìn)著的。

(3)高級語言

Python是高級語言。當(dāng)使用Python語言編寫程序時,無需再考慮諸如如何管理程序使用的內(nèi)存一類的底層細(xì)節(jié)。

(4)可移植性

由于Python的開源本質(zhì),它已經(jīng)被移植在許多平臺上。如果小心地避免使用依賴于系統(tǒng)的特性,那么所有Python程序無需修改就可以在下述任何平臺上運行。這些平臺包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acorn RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE,甚至還有PocketPC、Symbian以及Google基于Linux開發(fā)的Android平臺。

(5)解釋性

一個用編譯性語言如C或C++寫的程序可以從源文件(即C或C++語言)轉(zhuǎn)換到一個計算機(jī)使用的語言。這個過程通過編譯器和不同的標(biāo)記、選項完成。當(dāng)運行程序的時候,連接/轉(zhuǎn)載器軟件把程序從硬盤復(fù)制到內(nèi)存中并且運行。而Python語言寫的程序不需要編譯成二進(jìn)制代碼,可以直接從源代碼運行程序。在計算機(jī)內(nèi)部,Python解釋器把源代碼轉(zhuǎn)換成稱為字節(jié)碼的中間形式,然后再把它翻譯成計算機(jī)使用的機(jī)器語言并運行。事實上,由于不再擔(dān)心如何編譯程序,如何確保連接轉(zhuǎn)載正確的庫等,這一切使得使用Python變得更加簡單。由于只需要把Python程序復(fù)制到另外一臺計算機(jī)上,它就可以工作了,這也使得Python程序更加易于移植。

(6)面向?qū)ο?/p>

Python既支持面向過程編程,也支持面向?qū)ο缶幊?。在“面向過程”的語言中,程序是由過程或僅僅是可重用代碼的函數(shù)構(gòu)建起來的。在“面向?qū)ο蟆钡恼Z言中,程序是由數(shù)據(jù)和功能組合而成的對象構(gòu)建起來的。與其他主要的語言如C++和Java相比,Python以一種非常強(qiáng)大又簡單的方式實現(xiàn)面向?qū)ο缶幊獭?/p>

(7)可擴(kuò)展性

如果需要一段關(guān)鍵代碼運行的更快或者希望某些算法不公開,就可以把部分程序用C或C++語言編寫,然后在Python程序中使用它們。

(8)豐富的庫

Python標(biāo)準(zhǔn)庫確實很龐大。它可以幫助你處理各種工作,包括正則表達(dá)式、文檔生成、單元測試、線程、數(shù)據(jù)庫、網(wǎng)頁瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV文件、密碼系統(tǒng)、GUI(圖形用戶界面)、Tk和其他與系統(tǒng)有關(guān)的操作。記住,只要安裝了Python,所有這些功能都是可用的。這被稱作Python的“功能齊全”理念。除了標(biāo)準(zhǔn)庫以外,還有許多其他高質(zhì)量的庫,如wxPython、Twisted和Python圖像庫等。

(9)規(guī)范的代碼

Python采用強(qiáng)制縮進(jìn)的方式使得代碼具有極佳的可讀性。

1.1.3 Python的應(yīng)用領(lǐng)域

Python應(yīng)用的領(lǐng)域包括如下場景。

(1)Web應(yīng)用開發(fā)

Python經(jīng)常被用于Web開發(fā)。例如,通過mod_wsgi模塊,Apache可以運行用Python編寫的Web程序。Python定義了WSGI標(biāo)準(zhǔn)應(yīng)用接口來協(xié)調(diào)HTTP服務(wù)器與基于Python的Web程序之間的通信。一些Web框架,如Django、TurboGears、web2py、Zope等,可以讓程序員輕松地開發(fā)和管理復(fù)雜的Web程序。

(2)操作系統(tǒng)管理、服務(wù)器運維的自動化腳本

在很多操作系統(tǒng)里,Python是標(biāo)準(zhǔn)的系統(tǒng)組件。大多數(shù)Linux發(fā)行版以及NetBSD、OpenBSD和Mac OS X都集成了Python,可以在終端下直接運行Python。有一些Linux發(fā)行版的安裝器使用Python語言編寫,如Ubuntu的Ubiquity安裝器,Red Hat Linux和Fedora的Anaconda安裝器。Gentoo Linux使用Python來編寫它的Portage(包管理系統(tǒng))。Python標(biāo)準(zhǔn)庫包含了多個調(diào)用操作系統(tǒng)功能的庫。通過pywin32這個第三方軟件包,Python能夠訪問Windows的COM服務(wù)及其他Windows API。使用IronPython,Python能夠直接調(diào)用.Net Framework。一般說來,Python編寫的系統(tǒng)管理腳本在可讀性、性能、代碼重用度、擴(kuò)展性幾方面都優(yōu)于普通的shell腳本。

(3)科學(xué)計算

NumPy、SciPy、Matplotlib可以讓Python程序員編寫科學(xué)計算程序。

(4)桌面軟件

PyQt、PySide、wxPython、PyGTK是Python快速開發(fā)桌面應(yīng)用程序的利器。

(5)服務(wù)器軟件(網(wǎng)絡(luò)軟件)

Python對于各種網(wǎng)絡(luò)協(xié)議的支持很完善,所以經(jīng)常被用于編寫服務(wù)器軟件、網(wǎng)絡(luò)爬蟲。第三方庫Twisted支持異步網(wǎng)絡(luò)編程和多數(shù)標(biāo)準(zhǔn)的網(wǎng)絡(luò)協(xié)議(包含客戶端和服務(wù)器),并且提供了多種工具,被廣泛用于編寫高性能的服務(wù)器軟件。

(6)游戲

很多游戲使用C++編寫圖形顯示等高性能模塊,而使用Python或者Lua編寫游戲的邏輯、服務(wù)器。相較于Python,Lua的功能更簡單,體積更??;而Python則支持更多的特性和數(shù)據(jù)類型。

(7)構(gòu)思實現(xiàn),產(chǎn)品早期原型和迭代

YouTube、Google、Yahoo!、NASA都在內(nèi)部大量地使用Python。

1.1.4 Python的版本

Python發(fā)展到現(xiàn)在,經(jīng)歷了多個版本,大家可以在Python官網(wǎng)查看。網(wǎng)址是https://www.python.org/downloads/。截至目前,仍然保留的版本主要是基于Python 2.x和Python 3.x。表1-1列舉了Python的歷史版本。

表1-1 Python歷史版本

續(xù)表

在本書成稿時,Python 2的最新版本是Python 2.7.13,Python 3的最新版本是Python 3.6。關(guān)于Python 2.x和Python 3.x的區(qū)別將在下個小節(jié)進(jìn)行介紹,這里大家只需知道,Python 3.x不再兼容現(xiàn)有的2.x程序,在實際使用時,大家要根據(jù)實際情況選擇使用的版本。

1.1.5 Python 2.x和Python 3.x版本區(qū)別

和Python 2.x版本相比,Python 3.x版本在語句輸出、編碼、運算和異常等方面做出了一些調(diào)整,具體如下。

1.print函數(shù)替代了print語句

在Python 2.x中,輸出數(shù)據(jù)使用的是print語句。但是在Python 3.x中,print語句沒有了,取而代之的是print函數(shù)。示例代碼如下:

Python 2.x

>>> print(3,4)

(3, 4)

Python 3.x

>>> print(3,4)

3 4

2.Python 3.x默認(rèn)使用UTF-8編碼

Python 2.x中有ASCII Str()類型,unicode()是單獨的,不是byte類型。在Python 3.x版本的源代碼中,默認(rèn)使用的是UTF-8編碼,從而可以很好地支持中文或其他非英文字符。例如,輸出一句中文,使用Python 2.x和Python 3.x的輸出結(jié)果如下所示:

Python 2.x

>>> str = "我愛北京天安門"

>>> str

'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'

Python 3.x

>>> str = "我愛北京天安門"

>>> str

'我愛北京天安門'

3.除法運算

和其他語言相比,Python語言的除法非常高端,它的除法運算包含兩個運算符,分別是/和//,這兩個運算符在Python 2.x和Python 3.x中的使用如下所示。

(1)運算符 /

在Python 2.x中,使用運算符/進(jìn)行除法運算的方式和Java、C語言相似,整數(shù)相除的結(jié)果是一個整數(shù),浮點數(shù)除法會保留小數(shù)點的部分得到一個浮點數(shù)的結(jié)果。但是,在Python 3.x中使用運算符/進(jìn)行除法運算,整數(shù)之間的相除,結(jié)果也會是浮點數(shù)。示例代碼如下:

Python 2.x

>>> 1 / 2

0

>>> 1.0 / 2.0

0.5

Python 3.x

>>> 1/2

0.5

(2)運算符//

使用運算符//進(jìn)行的除法運算叫作floor除法,這種除法會對除法的結(jié)果自動進(jìn)行一個floor操作。使用這種運算符進(jìn)行的除法運算,在Python 2.x和Python 3.x中是一致的。示例代碼如下:

Python 2.x

>>> -1 // 2

-1

Python 3.x

>>> -1 // 2

-1

需要注意的是,使用運算符//進(jìn)行的除法是執(zhí)行floor操作,即獲取不大于結(jié)果值的最大整數(shù)(向下取整)。

4.異常

在Python 3.x版本中,異常處理改變的地方主要如下。

(1)在Python 2.x版本中,所有類型的對象都是直接被拋出的,但是在Python 3.x版本中,只有繼承自BaseException的對象才可以被拋出。

(2)在Python 2.x版本中,捕獲異常的語法是“except Exception, var”。在Python 3.x版本中,引入了as關(guān)鍵字,捕獲異常的語法變更為“except Exception as var”。

(3)在Python 2.x版本中,處理異常使用“raise Exception(args)”;在Python 3.x版本中,處理異常使用“raise Exception, args”。

(4)Python 3.x版本中取消了異常類的序列行為和.message屬性。

關(guān)于Python 2.x版本中和Python 3.x版本中處理異常的示例代碼如下:

Python 2.x

>>> try:

...  raise TypeError,"類型錯誤"

... except TypeError,err:

...  print err.message

...

類型錯誤

Python 3.x

>>> try:

...  raise TypeError("類型錯誤")

... except TypeError as err:

...  print(err)

...

類型錯誤

5.八進(jìn)制字面量表示

在Python 3.x中,表示八進(jìn)制字面量的方式只有一種,并且必須寫成“0o1000”這樣的方式,原來“01000”的方式不能使用了。示例代碼如下:

Python 2.x

>>> 0o1000

512

>>> 01000

512

Python 3.x

>>> 01000

 File "<stdin>", line 1

  01000

   ^

SyntaxError: invalid token

>>> 0o1000

512

6.不等于運算符

Python 2.x的不等于運算符有兩種寫法:!= 和 <>,但是,Python 3.x中去掉了<>, 只有!=一種寫法。示例代碼如下:

Python 2.x

>>> 1!=2

True

>>> 1<>2

True

Python 3.x

>>> 1!=2

True

>>> 1<>2

 File "<stdin>", line 1

  1<>2

   ^

SyntaxError: invalid syntax

>>>

7.數(shù)據(jù)類型

Python中數(shù)據(jù)類型的改變?nèi)缦隆?/p>

(1)Python 3.x去除了long類型,現(xiàn)在只有一種整型int,但它的行為就像是Python 2.x版本的long。

(2)Python 3.x新增了bytes類型,對應(yīng)于Python 2.x版本的八位串,定義一個bytes字面量的方法如下所示:

>>> b = b'china'

>>> type(b)

<type 'bytes'>

字符串對象和bytes對象可以使用.encode() (str→bytes) 或者 .decode() (bytes→str)方法相互轉(zhuǎn)化。示例代碼如下:

>>> s = b.decode()

>>> s

'china'

>>> b1 = s.encode()

>>> b1

b'china'

(3)Python 3.x中,字典的keys()、items()和values()方法用返回視圖代替了列表,而2.x版本中的iterkeys()等函數(shù)都被廢棄。同時去掉的還有has_key()方法,用in替代。

主站蜘蛛池模板: 林周县| 韶山市| 松原市| 甘孜县| 蒙自县| 漾濞| 屏东市| 阿图什市| 藁城市| 北辰区| 广南县| 许昌市| 淮安市| 延安市| 中方县| 穆棱市| 鄯善县| 汝州市| 天镇县| 武威市| 长沙县| 广平县| 滨州市| 绥德县| 黄石市| 延长县| 朝阳市| 伊川县| 罗江县| 土默特左旗| 墨脱县| 宁强县| 德令哈市| 鹿邑县| 韶山市| 崇信县| 乐业县| 辽宁省| 瑞丽市| 连平县| 东海县|