1. 概述?

本手冊?xún)H描述 Python 編程語(yǔ)言,不宜當作教程。

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

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

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

1.1. 其他實(shí)現?

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

知名的實(shí)現包括:

CPython

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

Jython

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

Python for .NET

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

IronPython

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

PyPy

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

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

1.2. 標注?

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

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

第一行表示 namelc_letter 之后跟零個(gè)或多個(gè) lc_letter 和下劃線(xiàn)。而 lc_letter 則是任意單個(gè) 'a''z' 字符。(實(shí)際上在本文檔中始終采用此規則來(lái)定義詞法和語(yǔ)法規則的名稱(chēng)。)

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

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

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