1. 简介

这份参考手册讲述Python编程语言。它并不打算作为一个教程。

除了语法和词法分析,在尽可能精确的同时,对所有内容我选择使用英语而不是形式化的说明。这应该使得这份文档对一般读者更容易理解, 但将导致某些地方意义不明确。因此, 如果你来自火星并试图仅仅通过这份文档重新实现 Python, 你可能不得不猜测一些东西, 其实事实上你将可能最终实现一种完全不同的语言。另一方面, 如果你正在使用 Python 并想知道该语言某一方面明确的规则, 你一定能在这里找到它们。如果你想要看该语言更正式的定义, 或许你可以自愿献出你的时间来写一份 — 那还不如用来发明一台克隆机器 :-)。

加入太多的实现细节到语言参考文档里是危险的 — 实现可能改变,同一语言的其它实现可能以不同的方法工作。另一方面,CPython是当前唯一一个广泛使用的Python实现(虽然存在其它实现),它的某些怪异的地方有时候是值得提及的,尤其是强加了额外限制的实现。因此,你将会发现散布在整个文档中的简短的“实现说明”。

每一种Python实现都伴随着若干内建和标准模块。这些文档位于Python标准库。一些内建的模块以重要的方式与语言的定义交互时会有所提及。

1.1. 各种实现

尽管已有一个目前最为流行的 Python 实现, 但还是有一些其它的实现, 它们对不同的用户有着特别的吸引力。

已知的实现包括:

CPython这是Python初始的以及维护得最好的实现,使用C编写。新的语言特性一般会最先在这里出现。Jython用Java 实现的Python。这个实现可以作为脚本语言在Java应用中使用,或者可以用来利用Java类库来创建应用。它也经常被用来为Java库创建测试。更多的信息可以在Jython网站上找到。用于.NET的Python这个实现实际上使用了CPython实现, 但是是一个.NET托管的应用程序,并使得.NET类库可以使用。它由Brian Lloyd创建。更多信息请参阅.NET版Python的主页。IronPython.NET 版的另外一种Python。与Python.NET不同,这是一个完整的Python实现,它产生IL并且直接把Python代码编译成.NET程序集。它由Jython 的初始创建者Jim Hugunin 创建。更多信息请参阅IronPython 网站。PyPy完全用Python 写的一种Python 实现。它支持一些在其它实现中没有的高级特性,例如无栈支持和JIT(即时)编译器。该项目的目标之一是,鼓励通过使得改变解释器更简单来试验语言本身(因为它是用 Python 写的)。更多信息可以访问 PyPy 项目的主页。 这里的每一个实现都会与这份手册里讲述的语言在某些方面有所不同, 或者引入超出标准Python 文档内容的特殊信息。请参阅特定实现的文档以确定关于你正在使用的特定实现,你还需要了解些什么。

1.2. 语法符号

词法分析和语法的描述使用一种修改过的BNF语法符号。它使用以下风格的定义:

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

第一行是说name是一个lc_letter,后面跟着一个零个或多个lc_letter和下划线组成的序列。接着,一个lc_letter是'a'到'z'之间任意一个单个字符。(这个规则事实上就是该文档中词法和语法规则中的名称的定义方式。)

每条规则以一个名字(这条规则定义的名字)和::=开始。竖线(|)用于分隔可选的项;它是该语法符号中绑定性最弱的操作符。星号()表示前面项目的零个或多个重复;类似地, 加号(+)表示一个或多个重复, 而方括号([])表示里面的内容出现零次或一次(换句话说, 方括号中的内容是可选的)。和+操作符的绑定性最强;圆括号用于分组。字符串字面值由引号引起来。空格只对分隔标识符有意义。规则通常包含在单独的一行中;具有许多可选项的规则可能会在第一行之后,每一行以一个竖线开始。

在词法定义中(如上面的例子),还使用了两个额外的约定:三个点号分隔的两个字符表示给出的范围内(包括这两个字符)的任何一个单个ASCII字符。尖括号(<...>)中的内容表示不是定义的符号的正式描述;例如,如果需要这可以用来描述‘控制字符’的概念。

虽然使用的语法符号几乎完全一样,词法和语法定义之间的含义有一个巨大的差异:词法定义工作在输入的单个字符上,而语法定义工作在由词法分析生成的标识符流上。下一章(“词法分析”)中使用的所有BNF都是词法定义;再往后的几章是语法定义。