Mark Pilgrim:深入 Python3

本文檔提取並解釋了提供資料中的主要論點:

Python 3 的核心特性與變革

提供的資料(「深入 Python 3」)的核心在於介紹 Python 語言的第三個主要版本及其與前一個版本 Python 2 的主要區別、新增功能及推薦的開發實踐。核心變革包括:

  1. print 從語句變為函數: Python 3 中,print() 成為一個標準函數,需要使用括號來包含其參數。這使得 print 的行為與其他函數更一致,並允許通過參數(如 endfile)更靈活地控制輸出,取代了 Python 2 中特殊的語法。
  2. bytesstr 的嚴格區分: 這是 Python 3 中最重要的改變之一。Python 2 模糊了文字(字元序列)和二進位資料(位元組序列)的界限,預設字串是位元組序列,而 Unicode 字串是另一種類型。Python 3 則明確區分 str (永遠代表 Unicode 字元序列) 和 bytes (永遠代表 0 到 255 之間的整數序列,即位元組)。兩者之間不進行隱式轉換,必須使用 .encode() (將 str 轉為 bytes) 和 .decode() (將 bytes 轉為 str) 進行顯式轉換,並指定編碼方式。這徹底解決了字元編碼問題帶來的困擾。
  3. 迭代器成為常態: Python 3 中,許多原本在 Python 2 中返回列表的函數或方法,現在改為返回迭代器或視圖(Views)。例如,字典的 .keys().items().values() 方法返回的是動態視圖,range() 函數返回的是迭代器。這意味著這些操作不再立即在記憶體中建立完整的列表,從而節省記憶體,尤其處理大量資料時效率更高。需要列表時,必須使用 list() 顯式轉換。
  4. 2to3 自動化移植工具: 為了協助開發者將現有的 Python 2 程式碼遷移到 Python 3,Python 提供了 2to3 腳本,可以自動修正許多語法和內建函數的變化,如 print 語句、unicode() 函數、xrange() 函數等。然而,它無法解決所有問題,特別是那些涉及 bytesstr 區別的邏輯問題,仍需要人工審查和修改。

內建資料型別及其應用

Python 3 提供了豐富且功能強大的內建資料型別,支援各種資料結構和操作:

  1. 基本型別:
    • 布林(Booleans): TrueFalse,在布林上下文中,許多非布林型別的值會被解釋為真或假(例如,數字 0、空序列、空集合、空字典為假)。
    • 數值(Numbers): 包括任意精度的整數(int,取代了 Python 2 的 intlong)、浮點數(float)、分數(fractions.Fraction)和複數。支援標準數學運算符(+, -, *, /, // 地板除, % 模除, ** 乘冪)。
    • 空值(None): 特殊的單例對象,代表沒有值。在布林上下文中為假。
  2. 序列型別(Sequences):
    • 列表(Lists): 有序、可變的集合,元素可以是任意型別,可透過索引(支援負索引)、切片存取、新增(append(), extend(), insert(), +)和刪除(del, remove(), pop()) 元素。
    • 元組(Tuples): 有序、不可變 的集合,特性類似列表,但一旦建立便無法修改。常用於表示一組相關且固定不變的值,或作為字典的鍵(因其不可變性)。支援索引和切片,可透過元組拆包(Unpacking)同時賦值給多個變數。
  3. 集合型別(Sets):
    • 集合(Sets): 無序、包含唯一元素的集合。支援新增(add(), update()) 和刪除(discard(), remove(), pop(), clear()) 元素,以及標準集合運算(聯集 union(), 交集 intersection(), 差集 difference(), 對稱差集 symmetric_difference())。空集合必須使用 set() 建立,因為 {} 用於建立空字典。
  4. 對映型別(Mappings):
    • 字典(Dictionaries): 無序的鍵值對集合,鍵必須是唯一的且為不可變型別(如字串、數字、元組),值可以是任意型別。透過鍵來存取、設定或刪除值。是 Python 中實現雜湊表(Hash Table)的基礎。

開發實踐與程式碼管理

除了語言核心和資料型別,資料也強調了軟體開發的推薦實踐:

  1. 模組化程式碼(Modular Code): 鼓勵將程式碼組織成模組(單一 .py 文件)或多文件模組(包含 __init__.py 的目錄),以提高可讀性和可維護性。使用相對匯入(Relative Imports,如 from . import another_module)來引用同一包內的模組。
  2. 函式與類別的使用(Functions & Classes): 介紹如何定義函數(def)和類別(class),使用文件字串(Docstrings)為程式碼添加說明,以及通過特殊方法(如 __init__, __str__, __len__, __getitem__ 等)客製化對象行為,使其表現得像內建型別(如序列、字典、數字等)。
  3. 迭代器與生成器(Iterators & Generators): 詳細解釋迭代器協定(__iter__, __next__, StopIteration),生成器函數(yield)和生成器表達式如何提供惰性求值(Lazy Evaluation)的能力,在處理大型序列時節省記憶體和提高效率。itertools 模組提供了許多高效的迭代器構建工具。
  4. 例外處理(Exception Handling): 強調使用例外來處理可預期的錯誤或異常情況,而非返回錯誤碼。介紹如何引發例外(raise)和處理例外(try...except)。
  5. 單元測試(Unit Testing): 推廣測試驅動開發(TDD)理念,即先編寫測試案例,再編寫程式碼使其通過。使用 Python 內建的 unittest 模組編寫獨立、自動化、可自我驗證的測試案例,以確保程式碼功能的正確性、防止過度編碼、支援重構並提高程式碼品質。測試涵蓋正常輸入和異常輸入。
  6. 重構(Refactoring): 在有良好單元測試的基礎上,鼓勵安全地修改已工作的程式碼以提高其效能、可讀性或可維護性。單元測試為重構提供了安全網。
  7. 程式碼打包與發佈(Code Packaging & Distribution): 使用 Python 內建的 Distutils 框架(以 setup.py 腳本為核心)來定義套件的元數據(名稱、版本、作者、許可證等)、指定要包含的文件(packagespy_modulesMANIFEST.in)並建立標準的分發包(如源碼包 sdist、Windows 安裝程式 bdist_wininst)。介紹如何將套件上傳到 Python 包索引(PyPI),並對套件進行分類以便使用者搜尋。
  8. HTTP Web 服務與資料序列化(HTTP Web Services & Data Serialization): 介紹如何使用 HTTP 協定(GET, POST 等)與 Web 服務互動,並強調使用功能更全面的第三方庫(如 httplib2)而非標準庫(urllib.request)以獲得更好的快取、驗證、壓縮和重定向支援。資料序列化(Pickling)是將 Python 對象轉為位元組序列(pickle 模組,Python 特定)或跨語言通用格式(如 JSON,json 模組)以便存儲或傳輸的過程,並介紹如何處理 JSON 不原生支援的資料型別。

總而言之,提供資料詳盡地介紹了 Python 3 的核心特性、內建工具、推薦的程式碼結構、開發實踐以及如何將程式碼發佈和與外部服務互動,特別強調了 bytesstr 的區別以及單元測試在整個開發生命週期中的重要性。