1.介绍

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

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

向语言参考文档添加太多实现细节是危险的 – 实现可能会改变,同一语言的其他实现可能会有不同的工作方式。另一方面,CPython是广泛使用的一种Python实现(尽管替代实现继续获得支持),并且有时值得提及其特定的怪癖,特别是在实现带来额外限制的情况下。因此,您会在整个文本中找到简短的“实施说明”。

每个Python实现都带有许多内置和标准模块。这些内容记录在Python标准库。当它们以明显的方式与语言定义交互时,会提到一些内置模块。

 

1.1。替代实现

尽管有一个Python实现是迄今为止最受欢迎的,但是有一些替代实现对于不同的受众特别感兴趣。

已知的实现包括:

CPython
这是用C语言编写的原始且维护最多的Python实现。新语言功能通常首先出现在此处。
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”

第一行表示,一个namelc_letter随后的零个或更多的序列lc_letterS和下划线。一个lc_letter又是任何单个字符的'a'通过'z'。(对于本文档中的词法和语法规则中定义的名称,实际上遵守此规则。)

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

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

尽管使用的符号几乎相同,但词法和句法定义的含义之间存在很大差异:词汇定义对输入源的各个字符进行操作,而语法定义则对由此生成的令牌流进行操作。词汇分析。BNF在下一章中的所有用法(“词法分析”)都是词汇定义; 在后续章节中使用的是句法定义。