离线下载
PDF版 ePub版

极客学院团队出品 · 更新于 2018-11-28 11:00:42

介绍

本参考手册描述了Python编程语言,不能替代入门教程。

虽然我尝试尽可能的精确,除了语法和词法分析之外,仍然选择使用英语而不是形式化的规范的来描述。这应该使文档更具可读性,但可能存在歧义。因此,如果你来自火星,仅从这个文档试图重新实现Python,您可能需要猜一些东西,事实上你可能会最终实施一门不同的语言。另一方面,如果您正在使用Python,想了解某些细节精确的语言规则,你应该可以在这里找到他们。如果你想看到一个更正式的语言定义,也许你自己搞了,或者发明一个克隆机:-)。

添加太多的实现细节到语言的参考文档中是危险的事情 — 实现可能会改变,并且同一语言的不同实现可能以不同方式工作。另一方面,CPython是广泛使用的一个Python实现(虽然替代实现继续得到支持),这里有些细节还是被提及了, 特别是某种实现增加了限制时, 因此你可以在本文档中找到“实现注意”的标记。

每个Python实现都提供了大量的内建和标准模块,他们被记录在Python Standard Libray中。一些与语言定义密切相关的内建模块也在这里被介绍了。

替代实现

虽然这是迄今为止最受欢迎的Python实现,不同的Python爱好者对一些替代的实现有特别感兴趣。

已知实现包括:

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

Jython
Python的Java实现。这个实现可以作为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文档。请参考详细的实现文档,以确定在使用的实现中还有什么是你想了解的。

记法

在描述词法和句法分析时候, 我们使用不甚严格的BNF, 通常是以下的定义方式:

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

第一行说明namelc_letter后跟随零个以上(包括零个)lc_letter或下划线的序列。lc_letter是”a”至”z”中任意一个字符.(实际上, 这个”name”的定义贯穿于本文档的整个词法和语法规则中)

每个规则以一个名字(为所定义的规则的名字)和一个冒号"::="为开始. 竖线(|)用于分隔可选项.这是记法中结合性最弱的符号.星号(*)意味着前一项的零次或多次的重复; 同样, 加号(+)意味着一次或多次的重复. 在方括号([])中的内容意味着它可以出现零次或一次(也就是说它是可选的).星号"*"和加号"+"与前面的项尽可能地紧密的结合, 小括号用于分组.字符串的字面值用引号括住.空白字符仅仅在分隔语言符号(token)时有用.通常规则被包含在一行之中, 有很多可选项的规则可能会被格式化成多行的形式, 后续行都以一个竖线开始。

在词法定义中(如上例), 有两个习惯比较常用:以三个句点分隔的一对串字面值意味着在给定(包括) 的ASCII字符范围内任选一个字符。在尖括号(<...>)中的短语给出了非正式的说明, 例如, 这用在了需要说 明”控制字符”记法的时候。

即使在句法和词法定义中使用的记法几乎相同, 但它们之间在含义上还是有着的很大不同: 词法定义是 在输入源的一个个字符上进行操作,而句法定义是在由词法分析所生成的语言符号流上进行操作。在下 节(”词法分析”)中使用的BNF都是词法定义, 以后的章节是句法定义。

上一篇: 关于 下一篇: 词法分析