复合语句:控制结构

复合语句

Python 提供了几种复合语句,用于从基本语句出发组合,形成复杂的语句结构。组合得到的结构还可以进一步组合。一个完整的复合语句通常延续多行,形成一个复杂的结构。

复合语句用于描述 Python 程序运行时的执行流程控制。每种复合语句确定了一种特定的执行流程,其执行将导致作为其成分的语句按一定的方式执行,从而完成特定的一系列计算动作。

理解一种复合语句,首先要掌握它的结构(语法形式),能够在程序里正确书写它们;还要理解它导致的其成分语句的执行过程(语义),知道什么时候应该采用哪种结构。

if 语句

if 语句根据给定的条件确定是否执行或者选择执行(一些)命令。其最基本的形式有两种:
	if 表达式 : 语句组
以及
	if 表达式 : 语句组
	else : 语句组
根据“表达式”的求值结果做出的逻辑判断确定具体执行过程。

如果语句里的“表达式”求出的值是真,上面第一种形式中的语句组将被执行,上面第二种形式中的第一个语句组将被执行。如果该表达式求出的值是假,第一种形式什么也不做,第二种形式将执行其第二个语句组。

注意上面介绍里的说法,这里说的是"求出的值是真"或"求出的值是假",而不是说"求出的值是 True"或"求出的值是 False"。用值是 True 或 False 的逻辑表达式作为判断条件显然是最合适的,但 Python 也允许用其他表达式作为 if 语句(以及下面介绍的 while 语句等)的条件。在讨论逻辑表达式和逻辑判断时,我们说明了 Python 语言把哪些值 "看作" 是真或是假。执行 if 语句的条件判断(以及其他逻辑判断)时用的就是那里说明的标准。

“语句组”和“段落”

在 if 语句里出现了“语句组”(原文为“suite”),下面很多地方都会出现“语句组”。“语句组”是 Python 里的一个重要概念,Python 对它有特殊的格式要求。

一个“语句组”必须在换行之后从下一行开始写,形式上是进一步退格后写出的一个或多个语句。Python 认为退格后的语句是更低一层的内容(是包含在前一层结构内部的东西),相互对齐的结构是同一层的内容。因此,组成一个语句组的同一层内容的多个语句要相互对齐。如果在一个语句组里的某个语句还是复合语句,其形式也一样,作为它的组成部分的下一层内容要进一步退格,如果有多行就又要求相互对齐。

Python 把从 if 或 else 开头的一段称为一个段落(clause),上面给出的 if 语句结构由一个或两个段落组成。Python 把"if 表达式 :" 或 "else :" 称为相应段落的头部,后随“语句组”是这个段落的主体。每个段落的头部最后总以一个冒号结束,其他复合语句的形式与此类似。

扩展的 if 语句

实际上,在一个 if 语句里,在其 if 段落和 else 段落之间还可以出现任意多个 "elif 表达式 : 语句组" 形式的段落,表示的语义是:如果在执行到这个段落之前没遇到值为真的“表达式”,而这个段落的“表达式”的值是真,那么就执行这个“语句组”。

注1:在一个 if 语句执行时,一旦有一个表示执行条件的“表达式”求出的值是真,与其相关的“语句组”就会执行,而位于这个“段落”之后(同属于这个 if 语句)的其他“段落”都不再考虑。也就是说,在一个 if 语句的执行过程中,至多有它所包含的一个“语句组”被执行(如果这个 if 语句没有 else 段落,就可能出现一个“语句组”也不执行的情况)。

注2:if 语句里的 "语句组" 总是作为低一层的内容。在“语句组”里不仅可以出现赋值、输入输入等简单语句,也可以出现嵌套的复合语句,例如嵌套的 if 语句。这种内层的复合语句又可能包含更低一层的内容,这些内容需要以进一步退格的方式书写。

while 语句

while 语句是一种实现重复执行的控制结构,这类语句也被称为循环语句,因为它们有可能导致一段代码(作为它们的组成部分的代码)被多次重复执行。while 语句包含一个实现逻辑判断的表达式,通过这个逻辑判断确定是继续重复执行还是停止执行。

while 语句的基本形式是一个段落:

	while 表达式 : 语句组
在一个 while 语句执行时,先求出表示其循环条件的“表达式”的值。如果求出的值是真,就执行它的语句组,在语句组执行完成后转回来再次执行这个 while 语句(也就是说,再次求表达式的值,判断,可能的“语句组”执行);如果表达式求出的值是假,这个 while 语句立即结束,程序向下继续执行。

与 if 语句的情况一样,这里不但允许用值为 True/False 的逻辑表达式作为条件,也允许用值为其他类型的表达式作为条件,根据其求出的值表示真还是假决定语句的执行。

语句组的形式与前面 if 语句一样,是换行并退格后写出的一组相互对齐的语句。

Python 允许在一个 while 语句里的 "while …" 段落之后紧跟一个 "else 语句组" 段落。如果出现这个段落,在 while 语句的表达式求出的值为假之后,将首先执行这个 else 段落的语句组,而后整个 while 语句结束。else 段落里的语句组只执行一次。

作为 while 语句的组成部分的语句组,其本身也经常又是复合语句(条件语句或循环语句,如 if 或 while 语句),或者在语句组的多个语句里包含复合语句,形成更复杂的嵌套结构。如果出现了嵌套的复合语句,它们的成分又应该进一步退格书写。

for语句

for 语句是另一种实现重复执行的语句(另一种循环语句),其最基本的形式是:
	for 变量 in 表达式 : 语句组
“表达式”的值应是一个“迭代器”(这是后面要介绍的一个重要概念,一个迭代器表示一系列值)。在 for 语句执行时,其“变量”顺序取由“表达式”得到的一系列值中的每个值,对变量的每个取值执行“语句组”一次。

在 for 语句的 "for 段落" 之后可以紧跟一个 "else 段落" 。如果出现这个段落,在上述有关语句组的执行完成后,执行一次这个 else 段落里的语句组。

for 语句执行时,其循环方式由“变量 in 表达式”部分控制,其中的“表达式”应该是值为“迭代器”的表达式。 Python 语言和系统提供了一些迭代器表达式,也允许写程序的人自己定义迭代器(后面介绍)。

迭代器表达式中最简单的是用系统提供的 range 函数写出的表达式,它能生成有规律的整数序列(由一系列整数值组成)。range 的基本使用形式有几种,最简单的是:

	range(n)
这里 n 应该是一个整数,这个表达式生成从 0 到 n-1 的整数序列。语句
	for i in range(10) :
	    n = n + i
将重复执行语句“n = n + i”10次,执行时变量 i 分别取值 0, 1, 2, 3, 4, 5, 6, 7, 8, 9。

表达式

	range(m, n)
将顺序地生成从 m 到 n-1 的所有整数的序列。表达式
	range(m, n, d)
将生成序列 m, m+d, m+2*d, … 直至最大的不超过 n-1 的 m+i*d,也就是从 m 开始的间距为 d 的等差整数序列,其中的最大值不超过 n-1。如果 range(m, n, d) 里的 d 是负数,生成的将是一个递减序列,其中最后一个值不小于 n+1。

如果 range(n) 里的 n 小于 1(是 0 或负数),或者在 range(m, n) 里的 n 不大于 m,生成的序列为空(不包含任何元素)。在 range(m, n, d) 形式中如果 d 为正数而 n 不大于 m,或者 d 为负数而 n 不小于 m,生成的序列也为空。

下面是几个例子,左边是写出的 range 表达式,右边是其生成的整数序列:

range(7)			0, 1, 2, 3, 4, 5, 6
range(5, 13)		5, 6, 7, 8, 9, 10, 11, 12
range(5, 31, 4)		5, 9, 13, 17, 21, 25, 29
range(2, -25, -3)		2, -1, -4, -7, -10, -13, -16, -19, -22
其他值为迭代器的表达式,以及如何自己定义迭代器的问题将在后面逐步介绍。

下面是一个用 range 写出的 for 循环的情况:

for i in range(3, 20, 2) :
    ... i ...
如果想做反方向的循环,可以利用函数 reverse:
for i in reversed(range(0, 20, 2)) :
    ... i ...
本页及相关页面(除另声明者外)由裘宗燕创建维护,可自由用于各种学习活动。其他使用需得到作者许可。