作者:empty 页数:152 出版社:empty |
本参考手册是对Python编程语言的描述.并不适宜作为教程使用.我希望尽可能地保证内容精确无误,但还是选择使用自然词句进行描述,正式的规格定义仅用于句法和词法解析,这样应该能使文档对于普通人来说更易理解,但也可能导致一些歧义,因此,如果你是来自火星并且想凭借这份文档把Python重新实现一遍, 也许有时需要自行猜测, 实际上最终大概会得到一个十分不同的语言, 而在另一方面, 如果你正在使用Python并且想了解有关该语言特定领域的精确规则,你应该能够在这里找到它们。如果你希望查看对该语言更正式的定义,也许你可以花些时间自己写上一份---或者发明一台克隆机器:-)在语言参考文档里加人过多的实现细节是很危险的---具体实现可能发生改变,对同一语言的其他实现可能使用不同的方式。而在另一方面, CPython是得到广泛使用的Python实现(然而其他一些实现的拥护者也在增加),其中的特殊细节有时也值得一提,特别是当其实现方式导致额外的限制时。因此,你会发现在正文里不时会跳出来一些简短的”实现注释”。每种Python实现都带有一些内置和标准的模块。相关的文档可参见library-index索引、少数内置模块也会在此提及,如果它们同语言描述存在明显的关联.
1.1其他实现虽然官方Python实现差不多得到最广泛的欢迎, 但也有一些其他实现对特定领域的用户来说更具吸引力.知名的实现包括CPython这是最早出现并待续维护的Python实现, 以C语言编写.新的语言特性通常在此率先添加.Jython以Java语言编写的Python实现。此实现可以作为Java应用的一个脚本语言, 或者可以用来创建Python for.NET此实现实际上使用了CPython实现, 但是属于NET托管应用并且可以引人.NET类库。IronPython另一个.NET的Python实现, 与Python.NET不同点在于它是生成IL的完全Python实现, 并PyPy完全使用Python语言编写的Python实现。它支持多个其他实现所没有的高级特性, 例如非栈式支The Python Language Reference, 发布3.8.1以上这些实现都可能在某些方面与此参考文档手册的述有所差异, 或是引人了超出标准Python文档范困的特定信息,请参考它们各自的专门文档,以确定你正在使用的这个实现有哪些你需要了解的东西.需要Java类库支持的应用。想了解更多信息可访问Jython回站。它的创造者是Brian Lloyd, 想了解详情可访问Python for NET主页。且将Python代码直接缩译为.NET程序集, 它的创造者就是当初创造Jython的Jim Hugunin。想了解详情可访问IronPython网站。持和JIT编译器等。此项目的目标之一是通过允许方便地修改解释器(因为它是用Python编写的)鼓励该对语言本身进行试验。想了解详情可访问PyPy项目主页。
1.2标注句法和词法解析的描述采用经过改进的BNF语法标注。这包含以下定义样式:nameeletter Io let cerl lc_letter:= a . z 第一行表示name是一个ic_letter之后跟零个或多个1c_letter和下划线。而一个1c_letter则是任意单个'a'至'z'字符。(实际上在本文档中始终采用此规则来定义词法和语法规则的名称。)每条规则的开头是一个名称(即该规则所定义的名称)加上::-,竖线(D)被用来分隔可选项,它是此标注中最灵活的操作符。星号(*)表示前项的零次或多次重复;类似地,加号(+)表示次或多次重复而由方括号括起的内容(I1)表示出现零次或一次(或者说,这部分内容是可选的),*和+操作符的绑定是最紧密的:圆括号用于分组。固定字符申包含在引号内。空格的作用仅限于分隔形符,每条规则通常为一行:有许多个可选项的规则可能会以竖线为界分为多行,在词法定义中(如上述示例),还额外使用了两个约定:由三个点号分隔的两个字符字面值表示在指定(闭)区间范围内的任意单个ASCII字符。由尖括号(.) 括起来的内容是对于所定义符号的非正式描述;即可以在必要时用来说明控制字符'的意图.虽然所用的标注方式几乎相同,但是词法定义和句法定义是存在很大区别的:词法定义作用于输人源中单独的字符, 而句法定文则作用于由词法分析所牛成的形符流。在下章节(“词法分析”) 中使用的BNF全部都是词法定义;在之后的章节中使用的则是句法定义.
CHAPTER 2词法分析Chapter 2.词法分析Python程序由一个解析器读取, 输人到解析器的是一个由词法分析器所生成的形并流, 本章将描述词法分析器是如何将一个文件拆分为一个个形符的。Python会将读取的程序文本转为Unicode码点:源文件的文本编码可由编码声明指定, 默认为UITF-8, 详情见PEP 3120。如果源文件无祛被解码, 将会引发SyntaxError,
2.1行结构一个Python程序可分为许多逻辑行。2.1.1逻辑行逻辑行的结束是以NEWLINE形符表示的, 语句不能跨越逻辑行的边界, 除非其语法允许包含NEWLINE(例如复合语句可由多行子语句组成)。一个逻辑行可由一个或多个物理行按照明确或隐含的行拼技规则构成,2.1.2物理行物理行是以一个行终止序列结束的字符序列。在源文件和字符串中,可以使用任何标准平台上的行终止序列-Unix所用的ASCII字符LF(换行) , Windows所用的ASCII字符序列CRLF(回车加换行) , 或者旧Macintosh所用的ASCII字符CR(回车) 。所有这些形式均可使用, 无论具体半台。输入的结束也会被作为最后一个物理行的隐含终止标志。当嵌人Python时, 源码字符中传人Python API应使用标准C的传统换行符(即 n, 表示ASCII字符LF作为行终止标志).The Python Language Reference, 发布3.8.12.1.3注释一条注释以不包含在字符串字面值内的井号()开头,井在物理行的末尾结束。一条注释标志着逻辑行的结束,除非存在隐含的行拼接规则。注释在语法分析中会被忽咯。2.1.4编码声明如果一条注释位于Python脚本的第一或第二行, 井且匹配正则表达式coding[=:1 s*4[- w.] +) , 这条注释会被作为编码声明来处理;上述表达式的第一组指定了源码文件的编码。编码声明必须独占一行。如果它是在第二行,则第一行也必须是注释推荐的编码声明形式如下-“-coding:canconino-Dame>这也是GNU Emacs认可的形式, 以及!vin:fileencoding-sencoding-name?这是Bram Moolenaar的VIM认可的形式.如果没有编码声明, 则默认编码为UTF-8。此外, 如果文件的首字节为UTF-8字节顺序标志(b' xef xbb xbf') , 文件编码也声明为UTF-8(这是Microsoft的notepad等软件支持的形式) 。编码声明指定的编码名称必须是Python所认可的编码。所有词法分析将使用此编码, 包括语义字符中、注释和标识符,2.1.5显式的行拼接两个或更多个物理行可使用反斜杠字符()拼接为一个逻辑行,规则如下:当一个物理行以一个不在字符串或注释内的反斜杠结尾时,它将与下一行拼接构成一个单独的逻辑行,反斜杠及其后的换行符会被别除。例如:if 1900 yoar2100 and 1 =non thc= 12and 1 day=31and0s=hourK24Xand oc=minute 6D and 0 =sa cond 60:#Looks lfk eav all d date以反斜杠结束的行不能带有注释.反斜杠不能用来拼接注释.反斜杠不能用来拼接形符,字符申除外(即原文字符申以外的形符不能用反斜杠分隔到两个物理行).不允许有原文字符申以外的反斜杠存在于物理行的其他位置,2.1.6隐式的行拼接圆括号、方括号或花括号以内的表达式允许分成多个物理行,无需使用反斜杠.例如:month_nemeaaandarlprebeuarit, Haani These are che隐式的行拼接可以带有注释。后续行的缩进不影响程序结构。后续行也允许为空白行,隐式拼接的行之间不会有NEWLINE形符。隐式拼接的行也可以出现于三引号字符串中(见下) ; 此情况下这些行不允许带有注释
一个只包含空格符, 制表符, 进纸符或者注释的逻辑行会被忽略(即不生成NEWLINE形符) .在交互模式输人语句时,对空白行的处理可能会因读取-求值-打印循环的其体实现方式而存在差异。在标准交互模式解释器中,一个完全空白的逻辑行(即连空格或注释都没有)将会结束一条多行复合语句,2.1.8缩进一个逻辑行开头处的空白(空格符和制表符)被用来计算该行的缩进等级,以决定语句段落的组织结构。制表符会被(从左至右) 替换为至八个空格, 这样缩进的空格总数为八的倍数(这是为了与Unix所用的规则一致).首个非空白字符之前的空格总数将确定该行的缩进层次。一个缩进不可使用反斜杠进行多行拼接:首个反斜杠之前的空格将确定组进层次,在一个源文件中如果混合使用制表符和空格符缩进,并使得确定编进层次需要依赖于制表符对应的空格数量设置.则被视为不合规则; 此情况将会引发Tab Error。跨平台兼容性注释:山于非UNIX平台上文本编辑器本身的特性, 在一个源文件中混合使用制表符和空格符是不明智的,另外也要注意不同平台还可能会显式地限制最大缩进层级。行首有时可能会有一个进纸符;它在上述缩进层级计算中会被忽略、处于行首空格内其他位置的进纸符的效果未定义(例如它可能导致空格计数重置为零)多个连续行各自的缩进层级将会被放人一个堆栈用来生成INDENT和DE DENT形符, 具体说明如下,在读取文件的第一行之前,先向堆栈推人一个零值:它符不再被弹出、被推人栈的层级数值从底至顶持续增加每个逻辑行开头的行缩进层级将与栈项行比较.如果相同,则不做处理.如果新行层级较高,则会被推人栈顶, 并生成一个INDENT形符.如果新行层级较低, 则应当是栈中的层级数值之一; 栈中高于该层级的所有数值都符被弹出, 每弹出一级数值生成一个DE DENT形符。在文件末尾, 栈中剩余的每个大于零的数值生成一个DE DENT形符。