1. 簡介¶
本參考手冊描述了 Python 程式語言。它並非旨在作為教程。
雖然我力求儘可能精確,但我選擇使用英語而非正式規範,除了語法和詞法分析部分。這應該使文件對普通讀者更易理解,但也為歧義留下了空間。因此,如果您來自火星並試圖僅根據本文件重新實現 Python,您可能不得不猜測一些事情,而且實際上您最終可能會實現一種完全不同的語言。另一方面,如果您正在使用 Python 並想知道關於該語言特定領域的精確規則,您應該絕對能夠在這裡找到它們。如果您希望看到更正式的語言定義,也許您可以志願貢獻您的時間 — 或者發明一臺克隆機器 :-)。
在語言參考文件中新增過多的實現細節是危險的 — 實現可能會改變,而且同一語言的其他實現可能會以不同的方式工作。另一方面,CPython 是廣泛使用的 Python 實現(儘管其他實現繼續獲得支援),並且它的特殊怪癖有時值得一提,尤其是在實現施加額外限制的地方。因此,您會在文字中發現零星的“實現註釋”。
每個 Python 實現都附帶許多內建和標準模組。這些在 Python 標準庫 中有文件記錄。當一些內建模組與語言定義以重要方式互動時,會提及它們。
1.1. 其他實現¶
儘管有一個 Python 實現是最受歡迎的,但也有一些其他實現對不同的受眾特別感興趣。
已知的實現包括
- CPython
這是 Python 的原始且維護最多的實現,用 C 編寫。新的語言特性通常首先出現在這裡。
- Jython
用 Java 實現的 Python。此實現可以用作 Java 應用程式的指令碼語言,也可以用於使用 Java 類庫建立應用程式。它也經常用於為 Java 庫建立測試。有關更多資訊,請訪問 Jython 網站。
- Python for .NET
此實現實際上使用 CPython 實現,但它是一個託管的 .NET 應用程式,並使 .NET 庫可用。它由 Brian Lloyd 建立。有關更多資訊,請參閱 Python for .NET 主頁。
- IronPython
另一種用於 .NET 的 Python。與 Python.NET 不同,這是一個完整的 Python 實現,它生成 IL,並將 Python 程式碼直接編譯為 .NET 程式集。它由 Jython 的原始建立者 Jim Hugunin 建立。有關更多資訊,請參閱 IronPython 網站。
- PyPy
完全用 Python 編寫的 Python 實現。它支援其他實現中沒有的幾個高階功能,如無堆疊支援和即時編譯器。該專案的目標之一是透過使修改直譯器更容易(因為它用 Python 編寫)來鼓勵對語言本身的實驗。更多資訊可在 PyPy 專案的主頁 上找到。
這些實現中的每一個都以某種方式與本手冊中記錄的語言有所不同,或者引入了超出標準 Python 文件中涵蓋的特定資訊。請參閱特定於實現的文件,以確定您需要了解的有關您正在使用的特定實現的任何其他資訊。
1.2. 符號¶
詞法分析和語法的描述使用了修改後的 巴科斯正規化(BNF) 語法表示法。它使用以下定義樣式
name ::=lc_letter
(lc_letter
| "_")* lc_letter ::= "a"..."z"
第一行表示一個 name
是一個 lc_letter
,後跟零個或多個 lc_letter
和下劃線的序列。lc_letter
反過來是 'a'
到 'z'
的任何單個字元。(此規則實際上適用於本文件中詞法和語法規則中定義的名稱。)
每個規則都以一個名稱(這是由該規則定義的名稱)和 ::=
開頭。豎線 (|
) 用於分隔備選項;它是此表示法中繫結性最弱的運算子。星號 (*
) 表示重複零次或多次前面的項;同樣,加號 (+
) 表示重複一次或多次,而方括號 ([ ]
) 中括起來的短語表示出現零次或一次(換句話說,括起來的短語是可選的)。 *
和 +
運算子儘可能緊密地繫結;括號用於分組。文字字串用引號括起來。空格僅對分隔標記有意義。規則通常包含在單行上;具有多個備選項的規則可以以替代方式格式化,其中第一行之後的每一行都以豎線開頭。
在詞法定義中(如上面的示例),還使用了另外兩個約定:兩個用三個點分隔的文字字元表示給定(包括)ASCII 字元範圍中任何單個字元的選擇。尖括號 (<...>
) 之間的短語給出了所定義符號的非正式描述;例如,如果需要,這可以用來描述“控制字元”的概念。
儘管使用的表示法幾乎相同,但詞法定義和語法定義之間存在很大的差異:詞法定義對輸入源的單個字元進行操作,而語法定義對詞法分析生成的標記流進行操作。下一章(“詞法分析”)中所有 BNF 的使用都是詞法定義;後續章節中的使用是語法定義。