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

1.3 從2.7到3.7,Python的新特性

目前,Python有兩個版本,一個是2.x版,另一個是3.x版,這兩個版本是不兼容的。3.x版不考慮對2.x版代碼的向后兼容,當前來看,3.x版會越來越普及。在寫本書時,Python的最新版本是3.7.0,本書中的示例和講解的內容都是基于這個版本進行的。建議讀者安裝3.6.2以上的版本,這樣學習本教程中的內容才會更加容易。

在3.x中,一些語法、內建函數和對象的行為有所調整。大部分Python庫都同時支持Python 2.7.x和3.x版本,所以無論選擇哪個版本都可以。為了在使用Python時避免某些版本中常見的陷阱,或者需要移植某個Python項目時,依然有必要了解一下Python兩個常見版本之間的主要區別。

2.x和3.x版本之間的主要區別如下:

1. 使用__future__模塊

Python 3.x引入了一些與Python 2.x不兼容的關鍵字和特性。在Python 2.x中,可以通過內置的__future__模塊導入這些新內容。如果你希望在Python 2.x環境下寫的代碼也可以在Python 3.x中運行,那么建議使用__future__模塊。

2. print函數

雖然print語法是Python 3中一個很小的改動,而且應該已經廣為人知,但是依然值得提一下:Python 2中的print語句被Python 3中的print()函數取代,這意味著在Python 3中必須用括號將需要輸出的對象括起來。在Python 2中使用額外的括號也可以,但是如果要在Python 3中以Python 2的形式不帶括號調用print函數,就會觸發SyntaxError(語法錯誤)。

3. 整數除法

由于人們常常會忽視Python 3在整數除法上的改動(寫錯了也不會觸發SyntaxError),因此在移植代碼或在Python 2中執行Python 3的代碼時需要特別注意這個改動。

4. Unicode

Python 2有基于ASCII的str()類型,可通過單獨的unicode()函數轉成unicode類型,但沒有byte類型。在Python 3中有了Unicode(UTF-8)字符串和兩個字節類(bytes和bytearrays)。

5. xrange

在Python 2.x中,經常會用xrange()創建一個可迭代對象,通常出現在“for循環”或“列表/集合/字典推導式”中。在Python 3中,range()的實現方式與xrange()函數相同,所以不存在專用的xrange()(在Python 3中使用xrange()會觸發NameError)。

6. 觸發異常

Python 2支持新舊兩種異常觸發語法,而Python 3只支持帶括號的語法(不然會觸發SyntaxError)。

7. 處理異常

Python 3中的異常處理發生了一點變化。在Python 3中必須使用as關鍵字,Python 2中不需要。

8. next()函數和.next()方法

由于會經常用到next()函數(.next()方法),因此要提到另一個語法改動(實現方面也做了改動):在Python 2中,函數形式和方法形式都可以使用;在Python 3中,只能使用next()函數(試圖調用.next()方法會觸發AttributeError)。

9. for循環變量與全局命名空間泄漏

在Python 3.x中,for循環中的變量不再會泄漏到全局命名空間中了。

10. 比較無序類型

Python 3中另一個優秀的改動是,如果我們試圖比較無序類型,就會觸發一個TypeError。

11. 使用input()解析輸入內容

Python 3改進了input()函數,這樣該函數就會總是將用戶的輸入存儲為str對象。在Python 2中,為了避免讀取非字符串類型會發生的一些危險行為,不得不使用raw_input()代替input()。

12. 返回可迭代對象,而不是列表

某些函數和方法在Python 3中返回的是可迭代對象,而不像在Python 2中返回列表。對象只遍歷一次會節省很多內存,如果通過生成器多次迭代這些對象,效率就不高了。此時如果需要列表對象,可以通過Python 3的list()函數簡單地將可迭代對象轉成列表。

Python 3.7相對于Python 3.5,有如下新特性:

(1)重新實現了字典(dict)類型,以便能像PyPy的字典類型一樣使用更緊湊的表達方式。與Python 3.5相比,這使字典的內存用量減少了20%~25%。該特性在3.6版本實現。

(2)為asyncio模塊增加了新功能,如顯著的可用性、性能優化以及大量的錯誤修復。從Python 3.6開始,asyncio模塊不再是臨時的,其API也進入了穩定狀態。

(3)引入了一種新的字符串:_f-strings_,或者格式化字符串。格式化字符串帶'f'前綴,類似于str.format()接受的格式化字符串。它們包含由花括號括起來的替換字段,替換字段是表達式,它們會在運行時計算,然后使用format()協議進行格式化。

(4)在Python 3.6版本后,可在同一個函數體中使用await和yield。

(5)添加了對async for在list、set、dict解析式以及generator表達式中的使用支持。

(6)支持nanosecond的時間函數,方便對nanosecond的操作,提供了6個新增的函數,分別為:clock_gettime_ns()、clock_settime_ns()、monotonic_ns()、perf_counter_ns()、process_time_ns()和time_ns()。

(7)在新版本中添加了@dataclass裝飾器,利用該裝飾器可以減少數據類型定義的代碼行數。

主站蜘蛛池模板: 博罗县| 北流市| 桐梓县| 无为县| 禹州市| 招远市| 兰溪市| 鄂托克前旗| 宾阳县| 乐平市| 新安县| 郎溪县| 贵德县| 崇州市| 绥芬河市| 五家渠市| 定结县| 温州市| 皮山县| 九寨沟县| 时尚| 石嘴山市| 社旗县| 鄂伦春自治旗| 宁河县| 黑水县| 游戏| 侯马市| 广汉市| 临城县| 浦东新区| 汝州市| 宜阳县| 耒阳市| 洪雅县| 安国市| 盐山县| 大悟县| 平武县| 洞口县| 东明县|