![]() |
4.3 循环 |
重复结构主要是指循环控制结构,根据所设置的条件重复执行某一段程序语句,直到条件判断不成立,才会跳出循环。简单地说,重复结构用于设计需要重复执行的程序区块,也就是让程序代码更符合结构化设计的精神。例如,想要让计算机计算出1+2+3+4+…+10的值,在程序代码中并不需要我们大费周章地从1累加到10,原本既烦琐又重复的运算,使用循环控制结构就可以很轻松地实现目标。Python语言含有while循环和for循环,下面介绍相关的用法。
如果要执行的循环次数确定,那么使用for循环语句就是最佳的选择。但是,对于某些不能确定次数的循环,while循环更加适用。while循环语句与for循环语句类似,都属于前测试型循环。前测试型循环的工作方式是在循环程序区块的开始处必须先检查循环条件判断表达式,当判断表达式结果为真时,才会执行循环区块内的程序语句,我们通常把循环区块内的程序语句称为循环体。
while循环也是使用条件表达式判断真或假来控制循环流程的,当条件表达式为真时,才会执行循环体内的程序语句,当条件表达式为假时,程序流程就会跳出循环。While循环语句的格式如下:
while 条件表达式: #如果条件表达式成立,就执行这个程序区块中的程序语句
while循环语句的流程图如图4-10所示。
图4-10
while循环必须加入控制变量的初始值以及递增或递减表达式,编写循环程序时必须检查离开循环的条件是否存在,如果条件不存在,就会让循环体一直循环执行而无法停止,导致“无限循环”,也叫“死循环”。循环结构通常需要具备三个条件:
(1)循环变量初始值。
(2)循环条件表达式。
(3)调整循环变量的增减值。
例如下面的程序:
i=1 while i < 10: #循环条件表达式 print( i) i += 1 #调整循环变量的增减值
当i小于10时会执行while循环体内的程序语句,而后i会加1,直到i等于10,条件表达式结果为False,就会跳离循环。
for循环又称为计数循环,是程序设计中较常使用的一种循环形式,它可以重复执行固定次数的循环。如果设计程序时已知所需要的循环执行次数是固定的,那么for循环语句就是最佳的选择。Python语言中的for循环可以用来遍历任何序列的元素或表项,序列可以是元组、列表或字符串,按序列的顺序执行,语法如下:
for 元素变量 in 序列: #执行的指令 else: #else的程序区块,可加入或者不加入
也就是说,使用for循环时,可加入或者不加入else语句。上述Python语法所代表的意义是for循环会将一个序列(sequence),例如字符串(string)或列表(list)内所有的元素都遍历一遍,遍历的顺序是按照当前序列内元素(item,或称为表项)的顺序。例如,下列的x变量值都可以作为for循环的遍历序列元素:
x = "abcdefghijklmnopqrstuvwxyz" x = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
此外,如果要计算循环的执行次数,在for循环控制语句中必须设置循环的初始值、结束条件以及每执行完一轮循环的循环变量的增减值。for循环每执行一轮,如果增减值没有特别指定,就会自动累加1,加到条件符合为止。例如下面的语句是一个元组(1~5),使用for循环将元组中的数字元素打印出来:
x = [1, 2, 3, 4, 5] for i in x: print (i)
上面的程序语句的执行结果如图4-11所示。
图4-11
有关元组更高效的写法是直接调用range()函数,range()函数的格式如下:
range([初始值], 终值[, 增减值])
元组从“初始值”开始到“终值”的前一个数字为止,如果没有指定初始值,那么默认为0;如果没有指定增减值,默认递增1。调用range()函数的范例如下:
·range(3)表示从下标值0开始,输出3个元素,即0、1、2共3个元素。
·range(1,6)表示从下标值1开始,到下标值6-1前结束,也就是说,下标编号6不包括在内,即1、2、3、4、5共5个元素。
·range(4,10,2)表示从下标值4开始,到下标编号10前结束,也就是说,下标编号10不包括在内,递增值为2,即4、6、8共3个元素。
下面的程序代码示范了在for循环中搭配使用range()函数输出2~11之间的偶数。
for i in range(2, 11, 2): print(i)
上面程序的执行结果如图4-12所示。
图4-12
在使用for循环时,还有一个地方要特别注意,那就是print()函数。如果该print()有缩排的话,就表示在for循环体内要执行的操作会按照循环执行的次数来输出。如果没有缩排,就表示不在for循环体内,只会输出最后的结果。
我们知道调用range()函数配合for循环除了可以进行累加的运算外,还可以配合range()函数的参数执行更多变化的累加运算。例如,将某一范围内所有5的倍数进行累加。下面的范例程序将演示如何使用for循环将某一个数字范围内5的倍数进行累加。
【范例程序:sum5.py】将某一个数字范围内5的倍数进行累加
01 # -*- coding: utf-8 -*- 02 """ 03 将某一个数字范围内5的倍数进行累加 04 """ 05 sum = 0 #存储累加的结果 06 07 # 进入for/in循环 08 for count in range(0, 21, 5): 09 sum += count #将数值累加 10 11 print('5的倍数累加的结果=',sum) #输出累加的结果
程序的执行结果如图4-13所示。
图4-13
程序代码解析:
·第08、09行:将5、10、15、20这些数字进行累加。
另外,执行for循环时,如果想要知道元素的下标值,可以调用Python内建的enumerate函数。调用的语法格式如下:
for 下标值, 元素变量 in enumerate(序列元素):
例如(参考范例程序enumerate.py):
names = ["Eileen", "Jennifer", "Brian"] for index, x in enumerate(names): print ("{0}--{1}".format(index, x))
上面语句的执行结果如图4-14所示。
图4-14
接下来我们要介绍的是一种for嵌套循环(Nested Loop),也就是多重的for循环结构。在嵌套for循环结构中,执行流程必须先等内层循环执行完毕,才会逐层继续执行外层循环。双重嵌套的for循环结构格式如下:
例如,九九表就可以使用双重嵌套的for循环轻松完成。通过下面的范例程序来看看如何使用双重嵌套for循环制作九九表。
【范例程序:99Table.py】九九表
01 # -*- coding: utf-8 -*- 02 """ 03 程序名称:九九表 04 """ 05 06 for x in range(1, 10): 07 for y in range(1, 10): 08 print("{0}*{1}={2: ^2}".format(y, x, x * y), end=" ") 09 print()
程序的执行结果如图4-15所示。
图4-15
九九表是嵌套循环非常经典的范例,如果读者学过其他程序设计语言,相信会对Python语言的简洁感到惊叹。从这个范例程序可以清楚地了解嵌套循环的运行方式。下面简称外层for循环为x循环,内层for循环为y循环,如图4-16所示。
图4-16
当进入x循环时x=1,等到y循环从1到9执行完成之后,会再回到x循环继续执行,y循环体内的print语句不换行,y循环执行完成并离开y循环之后,才会执行外层x循环的print()语句进行换行,执行完成之后会得到九九表的第一行,如图4-17所示。
图4-17
当x循环都执行完毕,九九表就完成了。注意,一般初学者容易犯错的地方是内外循环体的语句交错,在多重嵌套循环结构中,内外层循环之间不可交错,否则就会引发错误。