本參考手冊描述了Python編程語言,不能替代入門教程。
雖然我嘗試盡可能的精確,除了語法和詞法分析之外,仍然選擇使用英語而不是形式化的規(guī)范的來描述。這應該使文檔更具可讀性,但可能存在歧義。因此,如果你來自火星,僅從這個文檔試圖重新實現(xiàn)Python,您可能需要猜一些東西,事實上你可能會最終實施一門不同的語言。另一方面,如果您正在使用Python,想了解某些細節(jié)精確的語言規(guī)則,你應該可以在這里找到他們。如果你想看到一個更正式的語言定義,也許你自己搞了,或者發(fā)明一個克隆機:-)。
添加太多的實現(xiàn)細節(jié)到語言的參考文檔中是危險的事情 — 實現(xiàn)可能會改變,并且同一語言的不同實現(xiàn)可能以不同方式工作。另一方面,CPython是廣泛使用的一個Python實現(xiàn)(雖然替代實現(xiàn)繼續(xù)得到支持),這里有些細節(jié)還是被提及了, 特別是某種實現(xiàn)增加了限制時, 因此你可以在本文檔中找到“實現(xiàn)注意”的標記。
每個Python實現(xiàn)都提供了大量的內(nèi)建和標準模塊,他們被記錄在Python Standard Libray中。一些與語言定義密切相關的內(nèi)建模塊也在這里被介紹了。
雖然這是迄今為止最受歡迎的Python實現(xiàn),不同的Python愛好者對一些替代的實現(xiàn)有特別感興趣。
已知實現(xiàn)包括:
CPython
這是Python的原始和被維護最多的實現(xiàn),用c語言編寫,新的語言特性通常首先出現(xiàn)在這里。
Jython
Python的Java實現(xiàn)。這個實現(xiàn)可以作為Java應用程序的腳本語言,或可用于創(chuàng)建使用Java類庫的應用。他也經(jīng)常被用于創(chuàng)建Java庫的測試。更多的信息可以在Jython的網(wǎng)站上找到。
Python for .NET
這個實際上使用了CPython的實現(xiàn),但它是一個托管的.NET應用程序,作為.NET庫提供。由Brian Lloyd創(chuàng)建,更多信息見Python for .NET主頁。
IronPython
另一個.NET實現(xiàn)的Python,與Python.NET不同,這是一個完整的Python實現(xiàn),生成IL,并直接編譯Python代碼到.NET程序集。由Jython的原作者Jim Hugunin創(chuàng)建。更多信息見IronPython網(wǎng)站
PyPy
完全用Python實現(xiàn)的Python。他支持在其他實現(xiàn)里沒有的幾個高級功能,像支持無堆棧和即時編譯。該項目的目標之一是鼓勵實驗與語言本身,使其更輕松地修改該解釋器 (因為它是用Python寫的),PyPy 項目主頁上可用的其他信息。
每種實現(xiàn)在某種程度上的變化,從本手冊記錄的語言,或者介紹具體信息以外的標準Python文檔。請參考詳細的實現(xiàn)文檔,以確定在使用的實現(xiàn)中還有什么是你想了解的。
在描述詞法和句法分析時候, 我們使用不甚嚴格的BNF, 通常是以下的定義方式:
name ::= lc_ letter (lc_ letter | "_ ")*
lc_letter ::= "a"..."z"
第一行說明name為lc_letter后跟隨零個以上(包括零個)lc_letter或下劃線的序列。lc_letter是”a”至”z”中任意一個字符.(實際上, 這個”name”的定義貫穿于本文檔的整個詞法和語法規(guī)則中)
每個規(guī)則以一個名字(為所定義的規(guī)則的名字)和一個冒號"::="為開始. 豎線(|)用于分隔可選項.這是記法中結合性最弱的符號.星號(*)意味著前一項的零次或多次的重復; 同樣, 加號(+)意味著一次或多次的重復. 在方括號([])中的內(nèi)容意味著它可以出現(xiàn)零次或一次(也就是說它是可選的).星號"*"和加號"+"與前面的項盡可能地緊密的結合, 小括號用于分組.字符串的字面值用引號括住.空白字符僅僅在分隔語言符號(token)時有用.通常規(guī)則被包含在一行之中, 有很多可選項的規(guī)則可能會被格式化成多行的形式, 后續(xù)行都以一個豎線開始。
在詞法定義中(如上例), 有兩個習慣比較常用:以三個句點分隔的一對串字面值意味著在給定(包括) 的ASCII字符范圍內(nèi)任選一個字符。在尖括號(<...>)中的短語給出了非正式的說明, 例如, 這用在了需要說 明”控制字符”記法的時候。
即使在句法和詞法定義中使用的記法幾乎相同, 但它們之間在含義上還是有著的很大不同: 詞法定義是 在輸入源的一個個字符上進行操作,而句法定義是在由詞法分析所生成的語言符號流上進行操作。在下 節(jié)(”詞法分析”)中使用的BNF都是詞法定義, 以后的章節(jié)是句法定義。