Mark Pilgrim:深入 Python3
本文檔提取並解釋了提供資料中的主要論點:
Python 3 的核心特性與變革
提供的資料(「深入 Python 3」)的核心在於介紹 Python 語言的第三個主要版本及其與前一個版本 Python 2 的主要區別、新增功能及推薦的開發實踐。核心變革包括:
-
print從語句變為函數: Python 3 中,print()成為一個標準函數,需要使用括號來包含其參數。這使得print的行為與其他函數更一致,並允許通過參數(如end和file)更靈活地控制輸出,取代了 Python 2 中特殊的語法。 -
bytes與str的嚴格區分: 這是 Python 3 中最重要的改變之一。Python 2 模糊了文字(字元序列)和二進位資料(位元組序列)的界限,預設字串是位元組序列,而 Unicode 字串是另一種類型。Python 3 則明確區分str(永遠代表 Unicode 字元序列) 和bytes(永遠代表 0 到 255 之間的整數序列,即位元組)。兩者之間不進行隱式轉換,必須使用.encode()(將str轉為bytes) 和.decode()(將bytes轉為str) 進行顯式轉換,並指定編碼方式。這徹底解決了字元編碼問題帶來的困擾。 -
迭代器成為常態: Python 3 中,許多原本在 Python 2 中返回列表的函數或方法,現在改為返回迭代器或視圖(Views)。例如,字典的
.keys()、.items()和.values()方法返回的是動態視圖,range()函數返回的是迭代器。這意味著這些操作不再立即在記憶體中建立完整的列表,從而節省記憶體,尤其處理大量資料時效率更高。需要列表時,必須使用list()顯式轉換。 -
2to3 自動化移植工具: 為了協助開發者將現有的 Python 2 程式碼遷移到 Python 3,Python 提供了
2to3腳本,可以自動修正許多語法和內建函數的變化,如print語句、unicode()函數、xrange()函數等。然而,它無法解決所有問題,特別是那些涉及bytes和str區別的邏輯問題,仍需要人工審查和修改。
內建資料型別及其應用
Python 3 提供了豐富且功能強大的內建資料型別,支援各種資料結構和操作:
-
基本型別:
-
布林(Booleans):
True和False,在布林上下文中,許多非布林型別的值會被解釋為真或假(例如,數字 0、空序列、空集合、空字典為假)。 -
數值(Numbers): 包括任意精度的整數(
int,取代了 Python 2 的int和long)、浮點數(float)、分數(fractions.Fraction)和複數。支援標準數學運算符(+,-,*,/,//地板除,%模除,**乘冪)。 -
空值(
None): 特殊的單例對象,代表沒有值。在布林上下文中為假。
-
布林(Booleans):
-
序列型別(Sequences):
-
列表(Lists): 有序、可變的集合,元素可以是任意型別,可透過索引(支援負索引)、切片存取、新增(
append(),extend(),insert(),+)和刪除(del,remove(),pop()) 元素。 - 元組(Tuples): 有序、不可變 的集合,特性類似列表,但一旦建立便無法修改。常用於表示一組相關且固定不變的值,或作為字典的鍵(因其不可變性)。支援索引和切片,可透過元組拆包(Unpacking)同時賦值給多個變數。
-
列表(Lists): 有序、可變的集合,元素可以是任意型別,可透過索引(支援負索引)、切片存取、新增(
-
集合型別(Sets):
-
集合(Sets): 無序、包含唯一元素的集合。支援新增(
add(),update()) 和刪除(discard(),remove(),pop(),clear()) 元素,以及標準集合運算(聯集union(), 交集intersection(), 差集difference(), 對稱差集symmetric_difference())。空集合必須使用set()建立,因為{}用於建立空字典。
-
集合(Sets): 無序、包含唯一元素的集合。支援新增(
-
對映型別(Mappings):
- 字典(Dictionaries): 無序的鍵值對集合,鍵必須是唯一的且為不可變型別(如字串、數字、元組),值可以是任意型別。透過鍵來存取、設定或刪除值。是 Python 中實現雜湊表(Hash Table)的基礎。
開發實踐與程式碼管理
除了語言核心和資料型別,資料也強調了軟體開發的推薦實踐:
-
模組化程式碼(Modular Code): 鼓勵將程式碼組織成模組(單一 .py 文件)或多文件模組(包含
__init__.py的目錄),以提高可讀性和可維護性。使用相對匯入(Relative Imports,如from . import another_module)來引用同一包內的模組。 -
函式與類別的使用(Functions & Classes): 介紹如何定義函數(
def)和類別(class),使用文件字串(Docstrings)為程式碼添加說明,以及通過特殊方法(如__init__,__str__,__len__,__getitem__等)客製化對象行為,使其表現得像內建型別(如序列、字典、數字等)。 -
迭代器與生成器(Iterators & Generators): 詳細解釋迭代器協定(
__iter__,__next__,StopIteration),生成器函數(yield)和生成器表達式如何提供惰性求值(Lazy Evaluation)的能力,在處理大型序列時節省記憶體和提高效率。itertools模組提供了許多高效的迭代器構建工具。 -
例外處理(Exception Handling): 強調使用例外來處理可預期的錯誤或異常情況,而非返回錯誤碼。介紹如何引發例外(
raise)和處理例外(try...except)。 -
單元測試(Unit Testing): 推廣測試驅動開發(TDD)理念,即先編寫測試案例,再編寫程式碼使其通過。使用 Python 內建的
unittest模組編寫獨立、自動化、可自我驗證的測試案例,以確保程式碼功能的正確性、防止過度編碼、支援重構並提高程式碼品質。測試涵蓋正常輸入和異常輸入。 - 重構(Refactoring): 在有良好單元測試的基礎上,鼓勵安全地修改已工作的程式碼以提高其效能、可讀性或可維護性。單元測試為重構提供了安全網。
-
程式碼打包與發佈(Code Packaging & Distribution): 使用 Python 內建的
Distutils框架(以setup.py腳本為核心)來定義套件的元數據(名稱、版本、作者、許可證等)、指定要包含的文件(packages、py_modules、MANIFEST.in)並建立標準的分發包(如源碼包sdist、Windows 安裝程式bdist_wininst)。介紹如何將套件上傳到 Python 包索引(PyPI),並對套件進行分類以便使用者搜尋。 -
HTTP Web 服務與資料序列化(HTTP Web Services & Data Serialization): 介紹如何使用 HTTP 協定(GET, POST 等)與 Web 服務互動,並強調使用功能更全面的第三方庫(如
httplib2)而非標準庫(urllib.request)以獲得更好的快取、驗證、壓縮和重定向支援。資料序列化(Pickling)是將 Python 對象轉為位元組序列(pickle模組,Python 特定)或跨語言通用格式(如 JSON,json模組)以便存儲或傳輸的過程,並介紹如何處理 JSON 不原生支援的資料型別。
總而言之,提供資料詳盡地介紹了 Python 3 的核心特性、內建工具、推薦的程式碼結構、開發實踐以及如何將程式碼發佈和與外部服務互動,特別強調了 bytes 和 str 的區別以及單元測試在整個開發生命週期中的重要性。
comments
comments for this post are closed