1. 概述?

本手冊僅描述 Python 編程語言,不宜當作教程。

我希望盡可能地保證內(nèi)容精確無誤,但還是選擇使用自然詞句進行描述,正式的規(guī)格定義僅用于句法和詞法解析。這樣應該能使文檔對于普通人來說更易理解,但也可能導致一些歧義。因此,如果你是來自火星并且想憑借這份文檔把 Python 重新實現(xiàn)一遍,也許有時需要自行猜測,實際上最終大概會得到一個十分不同的語言。而在另一方面,如果你正在使用 Python 并且想了解有關(guān)該語言特定領(lǐng)域的精確規(guī)則,你應該能夠在這里找到它們。如果你希望查看對該語言更正式的定義,也許你可以花些時間自己寫上一份 --- 或者發(fā)明一臺克隆機器 :-)

在語言參考文檔里加入過多的實現(xiàn)細節(jié)是很危險的 --- 具體實現(xiàn)可能發(fā)生改變,對同一語言的其他實現(xiàn)可能使用不同的方式。而在另一方面,CPython 是得到廣泛使用的 Python 實現(xiàn) (然而其他一些實現(xiàn)的擁護者也在增加),其中的特殊細節(jié)有時也值得一提,特別是當其實現(xiàn)方式導致額外的限制時。因此,你會發(fā)現(xiàn)在正文里不時會跳出來一些簡短的 "實現(xiàn)注釋"。

每種 Python 實現(xiàn)都帶有一些內(nèi)置和標準的模塊。相關(guān)的文檔可參見 Python 標準庫 索引。少數(shù)內(nèi)置模塊也會在此提及,如果它們同語言描述存在明顯的關(guān)聯(lián)。

1.1. 其他實現(xiàn)?

雖然官方 Python 實現(xiàn)差不多得到最廣泛的歡迎,但也有一些其他實現(xiàn)對特定領(lǐng)域的用戶來說更具吸引力。

知名的實現(xiàn)包括:

CPython

這是最早出現(xiàn)并持續(xù)維護的 Python 實現(xiàn),以 C 語言編寫。新的語言特性通常在此率先添加。

Jython

以 Java 語言編寫的 Python 實現(xiàn)。此實現(xiàn)可以作為 Java 應用的一個腳本語言,或者可以用來創(chuàng)建需要 Java 類庫支持的應用。想了解更多信息可訪問 Jython 網(wǎng)站。

Python for .NET

此實現(xiàn)實際上使用了 CPython 實現(xiàn),但是屬于 .NET 托管應用并且可以引入 .NET 類庫。它的創(chuàng)造者是 Brian Lloyd。想了解詳情可訪問 Python for .NET 主頁。

IronPython

另一個 .NET 的 Python 實現(xiàn),與 Python.NET 不同點在于它是生成 IL 的完全 Python 實現(xiàn),并且將 Python 代碼直接編譯為 .NET 程序集。它的創(chuàng)造者就是當初創(chuàng)造 Jython 的 Jim Hugunin。想了解詳情可訪問 IronPython 網(wǎng)站。

PyPy

完全使用 Python 語言編寫的 Python 實現(xiàn)。它支持多個其他實現(xiàn)所沒有的高級特性,例如非棧式支持和 JIT 編譯器等。此項目的目標之一是通過允許方便地修改解釋器 (因為它是用 Python 編寫的),鼓勵該對語言本身進行試驗。想了解詳情可訪問 PyPy 項目主頁。

以上這些實現(xiàn)都可能在某些方面與此參考文檔手冊的描述有所差異,或是引入了超出標準 Python 文檔范圍的特定信息。請參考它們各自的專門文檔,以確定你正在使用的這個實現(xiàn)有哪些你需要了解的東西。

1.2. 標注?

句法和詞法解析的描述采用經(jīng)過改進的 BNF 語法標注。這包含以下定義樣式:

name      ::=  lc_letter (lc_letter | "_")*
lc_letter ::=  "a"..."z"

第一行表示 namelc_letter 之后跟零個或多個 lc_letter 和下劃線。而 lc_letter 則是任意單個 'a''z' 字符。(實際上在本文檔中始終采用此規(guī)則來定義詞法和語法規(guī)則的名稱。)

每條規(guī)則的開頭是一個名稱 (即該規(guī)則所定義的名稱) 加上 ::=。 豎線 (|) 被用來分隔可選項,它是此標注中綁定程度最低的操作符。 星號 (*) 表示前一項的零次或多次重復,類似地,加號 (+) 表示一次或多次重復,而由方括號括起的內(nèi)容 ([ ]) 表示出現(xiàn)零次或一次 (或者說,這部分內(nèi)容是可選的)。 *+ 操作符的綁定是最緊密的,圓括號用于分組。 字符串字面值包含在引號內(nèi)。 空格的作用僅限于分隔形符。 每條規(guī)則通常為一行,有許多個可選項的規(guī)則可能會以豎線為界分為多行。

在詞法定義中 (如上述示例),還額外使用了兩個約定: 由三個點號分隔的兩個字符字面值表示在指定 (閉) 區(qū)間范圍內(nèi)的任意單個 ASCII 字符。由尖括號 (<...>) 括起來的內(nèi)容是對于所定義符號的非正式描述;即可以在必要時用來說明 '控制字符' 的意圖。

雖然所用的標注方式幾乎相同,但是詞法定義和句法定義是存在很大區(qū)別的: 詞法定義作用于輸入源中單獨的字符,而句法定義則作用于由詞法分析所生成的形符流。在下一章節(jié) ("詞法分析") 中使用的 BNF 全部都是詞法定義;在之后的章節(jié)中使用的則是句法定義。