1. 概述?

本手冊(cè)僅描述 Python 編程語(yǔ)言,不宜當(dāng)作教程。

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

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

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

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

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

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

CPython

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

Jython

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

Python for .NET

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

IronPython

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

PyPy

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

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

1.2. 標(biāo)注?

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

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

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

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

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

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