Skip to main content

1. 介绍

本参考手册描述了Python编程语言。它不是作为一个教程。

虽然我想尽可能精确,我选择使用英语而不是形式规范,除了语法和词法分析。这应该使文档对于普通读者来说更容易理解,但会留下模糊的空间。因此,如果你来自火星,并试图从这个文件单独重新实现Python,你可能不得不猜测的事情,事实上,你可能会最终实现相当不同的语言。另一方面,如果你正在使用Python并想知道关于语言的特定区域的确切规则,你应该肯定能够在这里找到它们。如果你想看到一个更正式的语言定义,也许你可以自愿你的时间—或发明一个克隆机:-)。

将太多的实现细节添加到语言参考文档中是危险的 - 实现可能改变,并且相同语言的其他实现可以不同地工作。另一方面,CPython是广泛使用的一个Python实现(虽然替代实现继续获得支持),并且其特殊的怪癖有时值得提及,特别是当实现施加额外的限制。因此,你会发现短的“实现注释”洒在整个文本。

每个Python实现都带有一些内置和标准模块。这些记录在 Python标准库 中。当一些内置模块以重要的方式与语言定义交互时,它们被提及。

1.1. 替代实现

虽然有一个Python实现是目前最受欢迎的,但有一些替代实现,对不同的受众特别感兴趣。

已知的实现包括:

CPython

这是Python的原始和最维护的实现,用C编写。新的语言特性通常首先出现在这里。

Jython

Python在Java中实现。此实现可用作Java应用程序的脚本语言,或可用于使用Java类库创建应用程序。它也常用于为Java库创建测试。更多信息可以在 Jython网站 找到。

Python for .NET

这个实现实际上使用CPython实现,但是是一个托管的.NET应用程序,并使.NET库可用。它是由Brian Lloyd创建的。有关更多信息,请参阅 Python for .NET主页

IronPython

一种替代Python for .NET。与Python.NET不同,这是一个完整的Python实现,它生成IL,并将Python代码直接编译为.NET程序集。它是由Jython的原创作者Jim Hugunin创建的。有关更多信息,请参阅 IronPython网站

PyPy

完全用Python编写的Python实现。它支持在其他实现中没有找到的几个高级功能,如stackless支持和Just in Time编译器。该项目的目标之一是鼓励用语言本身进行实验,使其更容易修改解释器(因为它是用Python编写的)。有关 PyPy项目主页 的更多信息。

这些实现中的每一个都以某种方式与本手册中所述的语言不同,或者引入了超出标准Python文档中所包含的特定信息。请参阅特定于实现的文档,以确定您需要了解的具体实施的其他信息。

1.2. 符号

词法分析和语法的描述使用修改的BNF语法记法。这使用以下定义样式:

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

第一行说,namelc_letter,后面是一系列零个或多个 lc_letter 和下划线。 lc_letter 又是单字符 'a''z' 中的任一个。 (对于本文档中词法和语法规则中定义的名称,实际遵守此规则。)

每个规则以名称(由规则定义的名称)和 ::= 开头。垂直条(|)用于分隔替代;它是这个符号中最少的绑定运算符。星(*)表示前一项的零个或多个重复;同样,加号(+)表示一个或多个重复,并且用方括号([ ])括起来的短语意味着零个或一个出现(换句话说,所包含的短语是可选的)。 *+ 运算符尽可能紧密地绑定;括号用于分组。文字字符串用引号括起来。空白只对分离令牌有意义。规则通常包含在一行中;具有许多替代的规则可以在第一开始之后用竖线替换地用每一行格式化。

在词法定义中(如上面的例子),使用另外两个约定:由三个点分隔的两个文字意味着在给定(包括)ASCII字符范围内的任何单个字符的选择。尖括号(<...>)之间的短语给出了定义的符号的非正式描述;例如,如果需要,这可以用于描述“控制字符”的概念。

即使所使用的符号几乎相同,词法和句法定义的含义也有很大的区别:词法定义对输入源的各个字符进行操作,而语法定义对由输入源生成的符号流进行操作。词汇分析。 BNF在下一章中的所有用法(“词法分析”)是词汇定义;后续章节中的用法是句法定义。