1. 简介¶
本参考手册描述了 Python 编程语言。它并非旨在作为教程。
虽然我力求尽可能精确,但我选择使用英语而非正式规范,除了语法和词法分析部分。这应该使文档对普通读者更易理解,但也为歧义留下了空间。因此,如果您来自火星并试图仅根据本文档重新实现 Python,您可能不得不猜测一些事情,而且实际上您最终可能会实现一种完全不同的语言。另一方面,如果您正在使用 Python 并想知道关于该语言特定领域的精确规则,您应该绝对能够在这里找到它们。如果您希望看到更正式的语言定义,也许您可以志愿贡献您的时间 — 或者发明一台克隆机器 :-)。
在语言参考文档中添加过多的实现细节是危险的 — 实现可能会改变,而且同一语言的其他实现可能会以不同的方式工作。另一方面,CPython 是广泛使用的 Python 实现(尽管其他实现继续获得支持),并且它的特殊怪癖有时值得一提,尤其是在实现施加额外限制的地方。因此,您会在文本中发现零星的“实现注释”。
每个 Python 实现都附带许多内置和标准模块。这些在 Python 标准库 中有文档记录。当一些内置模块与语言定义以重要方式交互时,会提及它们。
1.1. 其他实现¶
尽管有一个 Python 实现是最受欢迎的,但也有一些其他实现对不同的受众特别感兴趣。
已知的实现包括
- CPython
这是 Python 的原始且维护最多的实现,用 C 编写。新的语言特性通常首先出现在这里。
- Jython
用 Java 实现的 Python。此实现可以用作 Java 应用程序的脚本语言,也可以用于使用 Java 类库创建应用程序。它也经常用于为 Java 库创建测试。有关更多信息,请访问 Jython 网站。
- Python for .NET
此实现实际上使用 CPython 实现,但它是一个托管的 .NET 应用程序,并使 .NET 库可用。它由 Brian Lloyd 创建。有关更多信息,请参阅 Python for .NET 主页。
- IronPython
另一种用于 .NET 的 Python。与 Python.NET 不同,这是一个完整的 Python 实现,它生成 IL,并将 Python 代码直接编译为 .NET 程序集。它由 Jython 的原始创建者 Jim Hugunin 创建。有关更多信息,请参阅 IronPython 网站。
- PyPy
完全用 Python 编写的 Python 实现。它支持其他实现中没有的几个高级功能,如无堆栈支持和即时编译器。该项目的目标之一是通过使修改解释器更容易(因为它用 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 的使用都是词法定义;后续章节中的使用是语法定义。