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"
第一行表示 name
是 lc_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 全部都是詞法定義;在之后的章節中使用的則是句法定義。