Bootstrap

【Python学习手册(第四版)】学习笔记12.1-语法规则拓展

个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。

 本文是对【学习笔记10】-语句编写的通用规则 介绍过的语法概念进行复习并扩展。非常简单,应该是我写过的最简单的文章,阅读时间:约2-3分钟。


目录

语法规则

代码块分隔符

避免混合使用制表符和空格:Python中的新的错误检查

语句分隔符

示例

括号配对

反斜线

三重引号字符串常量

相同行上编写一个以上非复合语句


语法规则

一般来说,Python都有简单和基于语句的语法。但是,有些特性是我们需要知道的。

语句是逐个运行的,除非不这样编写

Python一般都会按照次序从头到尾执行文件中嵌套块中的语句,但是像if(还有循环)这种语句会使得解释器在程序内跳跃。Python经过一个程序的路径叫做控制流程,像if这类会对其产生影响的语句,通常叫做控制流程语句。

块和语句的边界会自动检测

Python的程序块中没有大括号或"being/end"等分隔字符;反之,Python使用首行下的语句缩进把嵌套块内的语句组合起来。同样地,Python语句一般是不以分号终止的,一行的末尾通常就是该行所写语句的结尾。

复合语句=首行+“:”+缩进语句

ython中所有复合语句都遵循相同格式:首行会以冒号终止,再接一个或多个嵌套语句,而且通常都是在首行下缩进的。缩进语句叫做块(有时叫做组)。在if语句中,elif和else分句是if的一部分,也是其本身嵌套块的首行。

 空白行、空格以及注释通常都会忽略

文件中空白行将忽略(但在交互模式提示符下不会)。语句和表达式中的空格几乎都忽略(除了在字符串常量内,以及用在缩进时)。注释总是忽略:它们以#字符开头(不是在字符串常量内),而且延伸至该行的末尾。

文档字符串(docstring)会忽略,但会保存并由工具显示。

Python支持的另一种注释,叫做文档字符串(简称docstring)。和#注释不同的是,文档字符串会在运行时保留下来以便查看。文档字符串只是出现在程序文件和一些语句顶端的字符串中。Python会忽略这些内容,但是,在运行时会自动将其附加在对象上,而且能由文档工具显示。文档字符串是Python更大型的文件策略的一部分。

代码块分隔符

Python会自动以行缩进检测块的边界,也就是程序代码左侧的空白空间。缩进至右侧相同距离的所有语句属于同一块的代码。

块内的语句会垂直对齐,就好像在一栏之内。块会在文件末尾或者碰到缩进量较少的行时结束,而更深层的嵌套块就是比所在块的语句进一步向右缩进。

例如,图12-1示范了下列程序代码的块结构。

嵌套块代码:一个嵌套块以再往右缩进的语句开始,碰到缩进量较少的语句或文件末尾时就结束。 

这段代码包含了三个模块:第一个(文件顶层代码)完全没有缩进,第二个(位于外层if语句内)则缩进四格,而第三个(位于嵌套if下的print语句)则缩进八格。

通常来说,顶层(无嵌套)代码必须于第1栏开始。嵌套块可以从任何栏开始。缩进可以由任意的空格和制表符组成,只要特定的单个块中的所有语句都相同即可。

也就是说,Python不在乎怎么缩进代码,只在乎缩进是否一致

每个缩进层级使用4个空格或者一个制表符,这是通常的惯例,但是Python世界中没有绝对的标准。

例如下面的错误示例:

这段代码的正确的缩进版本如下所示——即便对于这样的一个人工编写的示例,正确的缩进也会使得代码看上去更好:

在Python中,制造空白的一种主要用途就是用于代码左侧作为缩进。

缩进其实是Python语法中的一部分,而不仅仅是编程风格:任何特定单一块中的所有语句都必须缩进到相同的层次,否则Python会报告语法错误

把缩进变成语法模型一部分,也强化了一致性,Python的语法偶尔描述成是“所见即所得”——每行程序代码毫不含糊的缩进就告诉了读者它属于什么地方。这种一致的外观让Python程序更易于维护和重用。

避免混合使用制表符和空格:Python中的新的错误检查

尽管可以使用空格或制表符来缩进,在一段代码块中混合使用这两者不是好主意,请使用其中的一种。

从技术上讲,制表符考虑到保留足够的空间以便把当前的栏数按照8的倍数来移动,并且,如果持续混合制表符和空格的话,代码也可以工作。

然而,这样的代码可能很难修改。更糟糕的是,混合制表符和空格会使得代码难以阅读——制表符在另一个程序员的编辑器中看上去与在你的编辑器中的样子有很大不同

语句分隔符

Python的语句一般都是在其所在行的末尾结束的。不过,当语句太长、难以单放在一行时,有些特殊的规则可用于使其位于多行之中。

使用括号对可横跨数行

如果在封闭的()、{}或[]这类配对中编写代码,Python就可让你在下一行继续输入语句。例如,括号中的表达式以及字典和列表常量,都可以横跨数行。语句不会结束,直到Python解释器到达你输入闭合括号)、}或]所在的行。

超出该语句之外的第2行可在任何缩进层次开始,而且应该尽可能让它们垂直对齐以便于阅读。

以反斜线结尾可横跨数行

有点过时的功能,但是如果语句需要横跨数行,你也可以在前一行的末尾加上反斜线(\),以表示你要在下一行继续输入。

也可以在较长结构两侧加上括号以便继续输入,反斜线几乎都已经不再使用了。这种方法容易导致错误:偶尔忘掉一个\通常会产生语法错误,并且可能导致下一行默默地被错误地看做一条新语句,这会产生不可预期的结果。

字符串常量有特殊规则

三重引号字符串块可以横跨数行。相邻的字符串常量是隐式地连接起来的,当与前面提到的开放对规则一起使用的时候,把这个结果包含到圆括号中就可以允许它跨越多行。

其他规则

可以用分号终止语句:这种惯例有时用于把一个以上的简单(非复合)语句挤进单个的行中。

注释和空白行也能出现在文件的任意之处。注释(以#字符开头)则在其出现的行的末尾终止。

示例

括号配对

使用括号配对规则让行保持连续,可以把受界线限制的内容放在任意数目的行中:

>>> l = ['good',
     'bad',
     'ugly']

括号可以存放表达式、函数参数、函数的首行、元组和生成器表达式,以及可以放到花括号中的任何内容(字典以及集合常量、集合和字典解析)等内容。

反斜线

使用反斜线来使这一行继续也是可以的,但是这在实际的Python中并不是很常见。

>>> if a ==b and c == d and \
    d == e and f == g:
        print(1)

任何表达式都可以包含在括号内,如果程序代码需要横跨数行,通常可以改用开放对技术——直接把语句的部分包含在圆括号中:

>>> if (a ==b and c == d and 
   d == e and f == g):
	print(1)

实际上,反斜线不太好用,因为太容易不被注意并且太容易漏掉。

下面的例子,x通过反斜杠赋值为10,这是本来的意图;如果偶然漏掉了反斜杠,那么,x赋值为6,并且不会报告错误(+4本身是一个有效的表达式语句)。

在带有一个复杂赋值的实际程序中:

>>> x = 1 + 2 + 3 \
    + 4
>>> x
10
>>> 

三重引号字符串常量

如果两个字符串常量彼此相邻地出现,它们会合并,就好像在它们之间已经放置了一个+——当和开放对规则一起使用的时候,包括在圆括号中就允许这种形式跨越多行。

例如:

>>> s = """
aa
bb
cc"""
>>> s
'\naa\nbb\ncc'

>>> s = ('aa'
     'bb'    #评论忽略
     'cc')    
>>> s
'aabbcc'

第一个示例在换行处插入换行字符,并且把'\naaaa\nbbbb\ncccc'赋给S,第二个示例隐式地合并,并且把S赋值为'aaaabbbbcccc'。第二种形式中的注释被忽略。

相同行上编写一个以上非复合语句

Python允许在相同行上编写一个以上的非复合语句(语句内未嵌套其他语句),由分号隔开。

有些程序员使用这种形式来节省程序文件的量,但是,如果坚持多数代码都是让一个语句一行,会使程序更具可读性:

>>> x = 1; y = 2;print(x)
1
>>> 

Python可把复合语句的主体上移到首行,只要该主体只是简单(非复合)语句。简单if语句及单个测试和动作常常用到这种用法:

>>> if 1: print('hi')

hi
>>> 

;