Mark Pilgrim:dive Into Python3
以下是根據提供的資料所提取的主要論點及其詳細解釋:
這份文件是《Dive Into Python 3》的開頭章節與附錄,旨在引導讀者深入了解 Python 3 的新特性、核心概念、常用標準函式庫、進階主題以及如何將現有的 Python 2 程式碼遷移到 Python 3。主要論點圍繞在 Python 3 相較於 Python 2 的變革,以及 Python 在資料處理、程式組織和開發實踐上的獨特方式。
-
Python 3 的核心變革與字串處理的根本不同:
- Python 3 相較於 Python 2 最顯著的變化之一在於字串處理。Python 2 有「字串」(
str,位元組序列)和「Unicode 字串」(unicode,Unicode 字元序列),兩者之間的轉換有時是隱式的。 - Python 3 則明確區分「位元組」(
bytes)和「字串」(str)。所有str都代表 Unicode 字元序列,而bytes代表不可變的 0 到 255 範圍內的整數序列。Python 3 絕不會在字串和位元組之間進行隱式轉換。 - 這種區別貫穿於檔案操作(文字模式需指定編碼並處理字元與位元組的差異)、網路傳輸(HTTP 標頭通常是字串,內容可能是位元組)、序列化(如 pickle 格式的改變)等多個方面。理解何時使用字串、何時使用位元組,以及如何使用
.encode()將字串編碼為位元組,和使用.decode()將位元組解碼為字串,是遷移和編寫 Python 3 程式碼的關鍵。 -
print從 Python 2 的語句變為 Python 3 的函式,提供了更多的控制選項,如指定分隔符號 (sep)、結尾字元 (end) 和輸出目的地 (file)。 - Python 3 提供
2to3腳本,可以自動處理大部分從 Python 2 到 Python 3 的語法和標準函式庫變更,如print語句轉換、xrange到range、raw_input到input、以及許多模組的重新組織和方法更名。然而,對於字串和位元組的處理差異,往往需要手動修正。
- Python 3 相較於 Python 2 最顯著的變化之一在於字串處理。Python 2 有「字串」(
-
Python 的基礎語法與程式組織:
- Python 使用縮排來定義程式碼區塊(函式、迴圈、條件判斷等),而非大括號。這使得程式碼風格更加一致且易讀。
- 變數無需顯式聲明類型,Python 在賦值時自動確定和跟蹤其類型。
- 函式使用
def關鍵字聲明,可以有預設參數值和命名參數,呼叫時可以通過名稱傳遞參數,順序不限(但命名參數必須在位置參數之後)。 - 文件字串 (
docstring) 是函式、類別、模組的第一個語句,用於提供說明,並且可以在執行時通過__doc__屬性存取。 -
import語句用於引入模組,Python 會依據sys.path列表中的目錄順序尋找模組檔案。在套件內部,使用相對導入(from . import module)來引用同套件內的其他模組。
-
內建資料類型:
- Python 提供了豐富的原生資料類型,包括布林值 (
bool)、整數 (int,支援任意大小)、浮點數 (float)、分數 (fractions.Fraction)、複數,以及集合類型。 -
序列類型: 列表 (
list) 是最常用的序列,可變、有序,可以包含不同類型的元素,支援索引和切片。元組 (tuple) 是不可變、有序序列,行為類似列表但無法修改,常被用於多重賦值或作為字典鍵。字串 (str) 是 Unicode 字元序列,行為類似不可變序列(如元組)。位元組 (bytes) 是不可變的 0-255 整數序列,行為類似位元組版本的元組。 -
集合類型: 集合 (
set) 是無序、包含唯一元素的集合,支援聯集、交集、差集等集合運算。 -
映射類型: 字典 (
dict) 是無序的鍵值對集合,通過鍵來存取值,鍵必須是可雜湊的(不可變)物件。 - 這些資料類型中的許多(如列表、元組、字串、集合、字典、數字、
None)在布林上下文中都有定義的「真值」(Truthy)或「假值」(Falsy)行為(例如,空序列或None為 False,非空序列或非零數字為 True)。
- Python 提供了豐富的原生資料類型,包括布林值 (
-
萬物皆物件與進階概念:
- Python 的核心原則之一是萬物皆物件。這意味著數字、字串、列表、字典、函式、類別甚至模組都是物件,它們可以有屬性(attributes)和方法(methods),可以被賦值給變數、作為參數傳遞給函式、或作為函式的回傳值。
- 這個原則使得高階函式(接受函式作為參數或回傳函式)成為可能。閉包(Closure)是函式記住並存取其創建時的外部作用域變數的能力。
-
迭代器(Iterators)是 Python 處理序列數據的基礎,它們通過
__iter__()和__next__()方法定義如何遍歷序列。for迴圈等就是通過這些方法工作的。 -
產生器(Generators)是創建迭代器的一種簡潔方式,使用
yield關鍵字來暫停函式執行並回傳值,在下次需要值時從暫停處繼續。產生器表達式提供了一種更緊湊的產生器定義方式。 - 推導式(Comprehensions),如列表推導式、字典推導式、集合推導式,提供了一種語法糖,用簡潔的表達式創建新的列表、字典或集合,其底層機制也涉及迭代。
-
類別(Classes)允許定義自訂物件類型,
__init__是實例初始化方法。透過定義各種特殊方法(Special Method Names,以雙底線開頭和結尾),可以讓自訂類別的實例表現得像內建類型,例如像迭代器、像函式、像集合、像字典、像數字等等。
-
異常處理:
- Python 強烈鼓勵使用異常來處理錯誤情況,而非依賴錯誤碼。程式碼中預期可能出錯的地方應使用
try...except區塊來捕獲和處理特定類型的異常。 - 可以使用
raise語句拋出異常。未被捕獲的異常會導致程式終止並印出回溯資訊(traceback)。 - 標準函式庫定義了許多內建異常類型,如
ImportError(模組無法導入)、NameError(未定義的變數)、TypeError(操作數類型錯誤)、ValueError(操作數值無效)等。
- Python 強烈鼓勵使用異常來處理錯誤情況,而非依賴錯誤碼。程式碼中預期可能出錯的地方應使用
-
標準函式庫與生態系統:
- Python 擁有龐大而豐富的標準函式庫,覆蓋了文件處理 (
os,glob,io,gzip)、網路 (http.client,urllib套件,socketserver)、正規表達式 (re)、序列化 (pickle,json)、資料庫介面 (dbm套件)、XML 解析與生成 (xml.etree.ElementTree) 等眾多領域。 -
io模組是 Python 3 中處理串流(包括文字和二進制檔案)的基礎,強調在文字模式下必須指定編碼。with open(...) as ...:語句提供了一種安全、自動關閉資源的機制,這依賴於物件的上下文管理器協定 (__enter__,__exit__)。 -
itertools模組提供了許多高效的迭代器建構和組合工具。 - 除了標準函式庫,強大的第三方函式庫生態系統也是 Python 的優勢,例如
httplib2提供更完善的 HTTP 客戶端功能,lxml提供高效且功能更完整的 XML 處理能力。 -
unittest模組支援單元測試,是實現測試驅動開發(TDD)的基礎。TDD 流程強調先編寫測試用例(測試特定功能在正常和異常情況下的行為),然後再編寫使測試通過的程式碼。這有助於明確需求、防止過度開發、提高程式碼品質並支援安全重構。
- Python 擁有龐大而豐富的標準函式庫,覆蓋了文件處理 (
-
軟體打包與分發:
- Python 使用
Distutils框架進行軟體打包和分發,核心是setup.py腳本。 -
setup.py定義了套件的元資料(名稱、版本、作者、描述等),以及要包含的程式碼檔案和額外資源(通過MANIFEST.in)。 - Distutils 可以生成原始碼分發包 (
sdist) 和特定平台的安裝包(如 Windows 的圖形化安裝包bdist_wininst)。 - Python 套件索引(PyPI)是集中存放 Python 開源函式庫的倉庫,通過
setup.py可以註冊和上傳套件,並使用分類器幫助用戶搜尋。
- Python 使用
總結來說,這份資料詳盡地介紹了 Python 3 的核心設計理念(特別是字串與位元組分離)、基本語法結構、豐富的內建資料類型、強大的標準函式庫和第三方庫、進階的程式設計技術(迭代器、產生器、閉包、特殊方法、元類等),並強調了單元測試、TDD 和重構等重要的軟體開發實踐。遷移指南和個案研究則提供了從 Python 2 轉移到 Python 3 的具體技術細節和常見問題解決方案。
comments
comments for this post are closed