xdays

Python语言参考-简介

March 08, 2013

简介

本参考手册描述了 Python 语言,它本意并不是一篇教程。

尽管我努力做到尽可能的精确,除了语法和词法分析外我都用英语而不是标准的规范来阐述。这样应该让这篇文档对于普通读者来说更易读,但可能会产生歧义。所以,如果你来自火星,想通过此文档重新实现 Python,你可能需要猜测一些东西或者实际上你最终可能实现一种完全不同的语言。另一方面,如果你使用 Python,想了解这门语言一个特定方面的准确定义,你应该能从这里找到。如果你想搞明白这门语言更正式的定义,你可能需要奉献你的时间或者发明一台克隆机器。

在语言的参考手册里加入太多实现细节是非常危险的---|实现可能会变,同一语言的不同实现可能运行的完全不同。另一方面,目前广泛使用的只有一种 Python 实现(尽管存在其他实现),而且其特殊的模式值得一提特别是实现强加了一些限制。因此,你会看到一些“实现要点”散落于文档中。

每种 Python 实现都有很多其自己的内置模块,这些在 Ptyhon 标准模块中有说明。一些和语言的定义有重大关系的内置模块会被提及。

替代品

尽管目前最流行的 Python 实现只有一种,但有一些其他人感兴趣的替代品。

已知的实现包括:

  • Cpython 这是最初也是维护最好的 Python 实现,以 C 语言编写,新特性通常先出现在这里。
  • Jython Java 语言实现,这个版本可用于 Java 程序的脚本语言,或者用来借助 Java 类库创建 Java 程序。也可以用它给 Java 类写测试程序。更多信息可以访问 Jython 主页。
  • Python for .NET 此版本使用 Cpython 实现,但是一个受管理的应用,它让.NET 类可供使用。出自 Brian Lloyd 之手,更多信息访问 Python for .NET 主页
  • IronPython Python for .NET 的替代品,他是可以生成 IL 的完整 Python 实现,直接将 Python 代码编译为.NET 集合。由 Jim Hugunin,Jython 创始人开发,跟多信息参考 IronPython 主页
  • PyPy 完全用 Python 实现,它支持一些其他版本中没有的特性,如 stackless 支持和 Just in Time 编译器。项目的目标是通过语言自身来更容易地修改解释器(因为用 Python 编写),更多信息参考 PyPy 主页。

每种实现都此文档描述的语言或多或少有些出入,或者引入了些标准文档中没有的信息。请参考特定实现的文档来看看你需要额外了解什么。

范式

语法和词法分析的描述使用了一种修改过的 BNF 语法范式。就是下面这种风格的定义:

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

第一行的意思是 name 是由一个 lc_letter 后跟零个或者多个 lc_letter 和下划线。一个 lc_letter 是 a 到 z 任意一个字符(这个规则实际上描述了此文档中语法和词法中定义的名称)。

每个规则以一个名字(正是规则定义的名称)和::=开头。竖线用于分割多个可选值;这是此范式中最基本的绑定操作。*表示前面字符的零次或多次重复;类似的+表示一个或者多个重复;包含在[]中的字符表示出现零次或者一次(换句话说就是可选的)。*和+紧密结合;()用于分组。字符串用引号引起来。空格仅用作分隔标记。正常情况规则都写在一行,有多个可选值的规则可以以竖线开头写再多行里。

在词法定义中,有两种约定:两个以三个点分割的字符意思是介于两者间的任意字符;尖括号中的短语给予要表示的字符以说明信息,例如用来表示控制符。

尽管使用的范式几乎一样,但词法和语法的定义有很大不同:词法定义操作输入的单个字符上,而语法定义操作由词法分析产生的标记流上。下一章所有的 BNF 使用都是词法定义;接下来的章节中使用的都是语法定义。