第5 章 循环结构程序设计 结构化程序由顺序结构、选择结构和循环结构组成。前面已经介绍了顺序结构和选 择结构程序设计,本章主要介绍循环结构的程序设计。 循环结构是一种重复执行的程序结构。在许多实际问题中,需要对问题的一部分通 过若干次、有规律的重复计算来实现。例如,求大量数据之和、迭代求根、递推法求解等, 都要用到循环结构的程序设计。循环是计算机解题的一个重要特征,计算机运算速度快, 最善于进行重复性的工作。 Python语言提供了while语句和for语句来实现循环结构。 5.1 while语句结构 5.1.1 while 语句 1.while语句的一般格式 while语句是当型循环,一般格式为: while 条件表达式: 循环体 功能:条件表达式描述循环的条件,循环体语句描述要反复执行的操作,称为循环 图5.1 while循环流程图 体。while语句执行时,先计算条件表达式的值,当条件表达 式的值为真(非0)时,循环条件成立,执行循环体;当条件表 达式的值为假(0)时,循环条件不成立,退出循环,执行循环 语句之后的下一条语句。其执行流程如图5.1所示。 注意: (1)当循环体由多条语句构成时,必须用缩进对齐的方 式组成一个语句块来分隔子句,否则会产生错误。 (2)与if语句的语法类似,如果while循环体中只有一条 语句,可以将该语句与while写在同一行中。 (3)while语句的条件表达式不需要用括号括起来,表达式后面必须有冒号。 (4)如果表达式永远为真,循环将会无限地执行下去。因此,在循环体内必须要有修 改表达式值的语句,使其值趋向False,让循环趋于结束,避免出现无限循环。 86 Python 语言程序设计(第2 版) 2.在while语句中使用else子句 while语句中使用else子句的一般格式: while 条件表达式; 循环体 else: 语句 Python与其他大多数语言不同,可以在循环语句中使用else子句,即构成了while… else循环结构,else中的语句会在循环正常执行完的情况下执行(不管是否执行循环体)。 例如: count=int(input()) while count<5: print(count,"is less han 5") count=count+1 else: print(count,"is not less than 5") 程序的一次运行结果如下: 8 ↙ 8 is not less than 5 在该程序中,当输入8时,循环体一次都没有执行,退出循环时,执行else子句。 5.1.2 while 语句应用 【例5.1】 求Σ100 n=1n。 分析:本例实际是求若干个数之和的累加问题。定义sum 用于存放累加和,用n表 示加数,用循环结构来求解,每循环一次累加一个整数值,整数的取值范围为1~100。 程序如下: sum,n=1,0 while n<=100: sum=sum+n n=n+1 print("1+2+3+…+100=",sum) 程序运行结果: 1+2+3+…+100=5050 第5 章 循环结构程序设计 87 说明:程序中变量n有两个作用,其一是作为循环计数变量,其二是作为每次被累加 的整数值。循环体有两条语句,sum=sum + n实现累加;n=n+1使加数n每次增1, 这是改变循环条件的语句,否则循环不能终止,成为“死循环”。循环条件是当n小于或等 于100时,执行循环体,否则跳出循环,执行循环语句之后的下一条语句(print语句)以输 出计算结果。 思考:如果将循环体语句“s=s+n”和“n=n+1”互换位置,程序的运行结果如何? 对于while语句的用法,还需要注意以下几点。 (1)如果while后面表达式的值一开始就为假,则循环体一次也不会执行。例如: a=0 b=0 while a>0: b=b+1 (2)循环体中的语句可以是任意类型的合法语句。 (3)遇到下列情况,退出while循环: ● 表达式不成立; ● 循环体内遇到break、return等语句。 【例5.2】 从键盘上输入若干个数,求所有正数之和。当输入0或负数时,程序结束。 程序如下: sum=0 x=int(input("请输入一个正整数(输入0 或者负数时结束):")) while x>=0: sum=sum+x x=int(input("请输入一个正整数(输入0 或者负数时结束):")) print("sum=",sum) 程序运行结果: 请输入一个正整数(输入0 或者负数时结束): 13 请输入一个正整数(输入0 或者负数时结束): 21 请输入一个正整数(输入0 或者负数时结束): 5 请输入一个正整数(输入0 或者负数时结束): 54 请输入一个正整数(输入0 或者负数时结束): 0 sum = 92 【例5.3】 输入一个正整数x,如果x满足0=0 and x<99999: i=x n=0 while i>0: i=i//10 n=n+1 a=x%10 print("%d 是%d 位数,它的个位上数字是%d"%(x,n,a)) else: print("输入错误!") 程序运行结果: Please input x: 12345 12345 是5 位数,它的个位上数字是5 再次运行程序,结果如下: Please input x: -1 输入错误! 5.2 for语句结构 5.2.1 for 语句 1.for语句的一般格式 for语句是循环控制结构中使用较广泛的一种循环控制语句,特别适合于循环次数确 定的情况。其一般格式为: for 目标变量in 序列对象: 循环体 for语句的首行定义了目标变量和遍历的序列对象,后面是需要重复执行的语句块。 语句块中的语句要向右缩进,且缩进量要一致。 注意: (1)for语句是通过遍历任意序列的元素来建立循环的,针对序列的每一个元素执行 一次循环体。列表、字符串、元组都是序列,可以利用它们来创建循环。 (2)for语句也支持一个可选的else块,其功能就像在while循环中一样,如果循环 离开时没有遇到break语句,就会执行else块。也就是序列所有元素都被访问过了之后, 执行else块。其一般格式为: 第5 章 循环结构程序设计 89 for 目标变量in 序列对象: 语句块 else: 语句 2.rang对象在for循环中的应用 在Python3.x中,range()函数返回的是可迭代对象。Python专门为for语句设计了 迭代器的处理方法。range()函数的一般格式为: range([start,]end[,step]) range()函数共有3个参数,start和step是可选的,start表示开始,默认值为0,end 表示结束,step表示每次跳跃的间距,默认值为1。该函数功能是生成一个从start参数 的值开始,到end参数的值结束(但不包括end)的数字序列。 例如,传递一个参数的range()函数: >>> for i in range(5): print(i) 01234 传递两个参数的range()函数: >>> for i in range(2,4): print(i) 23 传递三个参数的range()函数: >>> for i in range(2,20,3): print(i) 258 11 14 17 90 Python 语言程序设计(第2 版) 执行过程中首先对关键字in后的对象调用iter()函数获得迭代器,然后调用next() 函数获得迭代器的元素,直到抛出StopIteration异常。 range()函数的工作方式类似于分片。它包含下限(上例中为2),但不包含上限(上 例中为20)。如果希望下限为0,则只可以提供上限,例如: >>>range(10) [0,1,2,3,4,5,6,7,8,9] 【例5.4】 用for循环语句实现例5.1。 程序如下: sum=0 for i in range(101): sum=sum+i print("1+2+3+…+100=",sum) 该例中采用range()函数得到一个0~100的序列,变量i依次从序列中取值累加到 sum 变量中。 5.2.2 for 语句应用 【例5.5】 判断m 是否为素数。 一个自然数,若除了1和它本身外不能被其他整数整除,则称为素数。例如,2、3、5、7 等。根据定义,只需检测m 能否被2,3,4,…,m-1整除,只要能被其中一个数整除,则 m 不是素数,否则就是素数。程序中设置标志量flag,若flag为0时,则m 不是素数;若 flag为1时,则m 是素数。 程序如下: m=int(input("请输入要判断的正整数m: ")) flag=1 for i in range(2,m): if m%i==0: flag=0 i=m #令i 为m,使i