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