1. 简介 — Python 文档
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 库。 它是由布赖恩劳埃德创建的。 有关更多信息,请参阅 Python for .NET 主页 。
- 铁蟒
- .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 的所有用法都是词法定义; 在后续章节中使用的是句法定义。