前言前言
本手册翻译自 Python 官方发行的 《Python Language Reference》 (https://docs.python.org/3/referenc
e/index.html) ,适用于 Python 3.4.3 版本。
Python 是一种解释性的、面向对象的、具有动态语义的高级程序设计语言。它内建高级数据结构,配以动态类型
和动态捆绑,使其在快速应用开发中非常有利,就像脚本或粘合语言一样将已存在的构件连接在一起。Python 的
简单性和句法的易学性使其代码具有优秀的可读牲,因此维护程序的成本得以大大降低。Python 具有模块和包的
概念,以支持程序的模块化和代码重用。在主流平台上,Python 的解释器和大量标准库都可以免费地以源代码形
式或可执行文件形式获得,并且可以自由发布。
本参考手册描述了该语言的语法和“核心语义”。手册本身是比较简洁的,但尽可能写得准确和完 整。那些非基
本的内置对象类型、内置函数和模块的语义在《Python Standard Library》 (https://docs.python.org/3/librar
y/index.html#library-index) 中进行描述。对于语言的浅显介绍,可以看看《The Python Tutorial》 (http
s://docs.python.org/3/tutorial/index.html#tutorial-index) 。对于 C 和 C++ 程序员, 有两个文档可供参考:
• 《 Extending and Embedding the Python Interpreter》 (https://docs.python.org/3/extending/inde
x.html#extending-index) ,是对 Python 扩展模块设计的总体介绍,
• 《 Python/C API Reference Manual》 (https://docs.python.org/3/c-api/index.html#c-api-index)
,则向 C/C++ 程序员们细致地描述了可以使用的接口。
> Python Language Reference 官网:https://docs.python.org/3/reference/index.html
更新日期更新日期
2015-04-09
更新内容更新内容
第一版发布 (Python V3.4.3)
目录目录
前言前言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
第 1 章第 1 章 介绍介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
第 2 章第 2 章 词法分析词法分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
第 3 章第 3 章 数据模型数据模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2020
第 4 章第 4 章 执行模型执行模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5353
第 5 章第 5 章 导入系统导入系统 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5757
第 6 章第 6 章 表达式表达式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7676
第 7 章第 7 章 简单语句简单语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100100
第 8 章第 8 章 复合语句复合语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115115
第 9 章第 9 章 顶层组件顶层组件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128128
第 10 章第 10 章 完整的语法规范
完整的语法规范 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131131
11
介绍介绍
第 1 章 介绍 | 4
本参考手册描述了Python编程语言,不能替代入门教程。
虽然我尝试尽可能的精确,除了语法和词法分析之外,仍然选择使用英语而不是形式化的规范的来描述。这应该
使文档更具可读性,但可能存在歧义。因此,如果你来自火星,仅从这个文档试图重新实现Python,您可能需要
猜一些东西,事实上你可能会最终实施一门不同的语言。另一方面,如果您正在使用Python,想了解某些细节精
确的语言规则,你应该可以在这里找到他们。如果你想看到一个更正式的语言定义,也许你自己搞了,或者发明
一个克隆机:-)。
添加太多的实现细节到语言的参考文档中是危险的事情 — 实现可能会改变,并且同一语言的不同实现可能以不同
方式工作。另一方面,CPython是广泛使用的一个Python实现(虽然替代实现继续得到支持),这里有些细节
还是被提及了, 特别是某种实现增加了限制时, 因此你可以在本文档中找到“实现注意”的标记。
每个Python实现都提供了大量的内建和标准模块,他们被记录在Python Standard Libray (https://docs.pytho
n.org/3/library/index.html#library-index) 中。一些与语言定义密切相关的内建模块也在这里被介绍了。
替代实现替代实现
虽然这是迄今为止最受欢迎的Python实现,不同的Python爱好者对一些替代的实现有特别感兴趣。
已知实现包括:
CPython
这是Python的原始和被维护最多的实现,用c语言编写,新的语言特性通常首先出现在这里。
Jython
Python的Java实现。这个实现可以作为Java应用程序的脚本语言,或可用于创建使用Java类库的应用。他也经
常被用于创建Java库的测试。更多的信息可以在Jython的网站 (http://www.jython.org/) 上找到。
Python for .NET
这个实际上使用了CPython的实现,但它是一个托管的.NET应用程序,作为.NET库提供。由Brian Lloyd创
建,更多信息见Python for .NET主页 (http://pythonnet.sourceforge.net/) 。
IronPython
另一个.NET实现的Python,与Python.NET不同,这是一个完整的Python实现,生成IL,并直接编译Python
代码到.NET程序集。由Jython的原作者Jim Hugunin创建。更多信息见IronPython网站 (http://ironpython.ne
t/)
PyPy
完全用Python实现的Python。他支持在其他实现里没有的几个高级功能,像支持无堆栈和即时编译。该项目的
第 1 章 介绍 | 5
目标之一是鼓励实验与语言本身,使其更轻松地修改该解释器 (因为它是用Python写的),PyPy 项目主页 (htt
p://pypy.org/) 上可用的其他信息。
每种实现在某种程度上的变化,从本手册记录的语言,或者介绍具体信息以外的标准Python文档。请参考详细的
实现文档,以确定在使用的实现中还有什么是你想了解的。
记法记法
在描述词法和句法分析时候, 我们使用不甚严格的BNF, 通常是以下的定义方式:
name ::= lc_ letter (https://docs.python.org/3/reference/introduction.html#grammar-token-lc_letter) (l
c_ letter (https://docs.python.org/3/reference/introduction.html#grammar-token-lc_letter) | "_ ")*
lc_letter ::= "a"..."z"
第一行说明 name 为 lc_letter 后跟随零个以上(包括零个) lc_letter 或下划线的序列。 lc_letter
是” a ”至” z ”中任意一个字符.(实际上, 这个” name ”的定义贯穿于本文档的整个词法和语法规则中)
每个规则以一个名字(为所定义的规则的名字)和一个冒号" ::= "为开始. 竖线( | )用于分隔可选项.这是记法中结合
性最弱的符号.星号( * )意味着前一项的零次或多次的重复; 同样, 加号( + )意味着一次或多次的重复. 在方括
号( [] )中的内容意味着它可以出现零次或一次(也就是说它是可选的).星号" * "和加号" + "与前面的项尽可能地紧
密的结合, 小括号用于分组.字符串的字面值用引号括住.空白字符仅仅在分隔语言符号(token)时有用.通常规则被
包含在一行之中, 有很多可选项的规则可能会被格式化成多行的形式, 后续行都以一个竖线开始。
在词法定义中(如上例), 有两个习惯比较常用:以三个句点分隔的一对串字面值意味着在给定(包括) 的ASCII字
符范围内任选一个字符。在尖括号( <...> )中的短语给出了非正式的说明, 例如, 这用在了需要说 明”控制字
符”记法的时候。
即使在句法和词法定义中使用的记法几乎相同, 但它们之间在含义上还是有着的很大不同: 词法定义是 在输入源
的一个个字符上进行操作,而句法定义是在由词法分析所生成的语言符号流上进行操作。在下 节(”词法分
析”)中使用的BNF都是词法定义, 以后的章节是句法定义。
22
词法分析词法分析
第 2 章 词法分析 | 7
一个 Python 程序是由一个解析器读取的。解析器的输入是一个由词法分析器生成的符号流。本章介绍了词法分
析器如何将文件分解为符号。
Python 将程序文本以 Unicode 代码点的方式读入;源文件的编码格式由编码声明给出,其默认值为 UTF-8
,详见 PEP 3120 (http://www.python.org/dev/peps/pep-3120) 。源文件无法被解析时,会引发 SyntaxErr
or (https://docs.python.org/3/library/exceptions.html#SyntaxError) 异常。
行结构行结构
一个 Python 程序会被分成多个逻辑行。
逻辑行逻辑行
逻辑行使用一个 NEWLINE 标记结尾。除非在语法中允许使用 NEWLINE (例如,复合语句中的声明语句之
间),否则声明语句不能跨多个逻辑行。逻辑行是由一个物理行,或多个通过显示或隐式行连接规则连接在一起的
物理行组成。
物理行物理行
物理行是一个以行尾序列结尾的字符序列。在源文件中,任何平台下标准的行终止序列都可以使用-在 Unix 平台
上使用 ASCII LF(换行)符,在 Windows 平台上使用 ASCII 字符序列CR LF(回车加换行),在老版本的 Macint
osh 平台上使用 ASCII CR(回车)符。无论使用什么平台,所有这些形式都可以使用。
使用嵌入式Python开发时,需要使用标准 C 语言约定的换行符将源代码传递给 Python API(字符 \n 表示 ASC
II LF,即行终止符)。
注释注释
注释以( # )字符开始(且此时该符号不是当前字符串的一部分),以该物理行的结尾为结束。如果没有调用隐式行
连接,那么注释即意味着逻辑行的结尾。注释会被语法分析所忽视,它们不会被作为程序代码处理。
编码声明编码声明
如果第一或第二行的 Python 脚本注释能够匹配正则表达式 coding[=:]\s*([-\w.]+) ,该注释会被当做编码声明处
理;该表达式的第一部分定义了源代码文件的编码格式。此表达式的推荐形式是
# -*- coding: -*-