1、第5章 循环结构目录 5.1 while循环结构 5.2 for循环结构 5.3 循环控制语句 5.4 循环的嵌套 5.5 循环结构程序举例5.1 while循环结构while循环结构 while循环结构是根据条件来判断是否需要继续重复执行语句块,故可以称为条件循环。无论循环的次数是否预知,都可以使用while语句来循环执行语句块。while语句包括两种形式:基本while语句;扩展while语句。基本while语句 先计算条件表达式,再执行循环体,故循环体有可能一次也不被执行 若条件表达式永为True,则循环将无限次的执行下去(俗称死循环)while 条件表达式:语句块条件表达式结果等价于T
2、rue,执行语句块,并返回条件处条件表达式结果等价于False,则循环结束 多数为比较表达式或逻辑表达式 但也可以是其他计算结果的表达式 条件表达式后必须加冒号 所有语句行都应向右缩进对齐 并保持一致的缩进方式【例5-1】求累加和 编写程序求1+2+3+100的值。步骤:Step1:初始化变量,i=1,sum=0。i表示被加数1100,sum存放1100的累加值。Step2:判断i=100的值是否为真,若为真,将i累加到sum,然后i加1。Step3:重复Step2直到i=100为假,退出循环。Step4:输出累加值sum。【例5-1】求累加和#1.i=1#2.sum=0#3.while i=
3、100000成立的最小n值。Step1:定义整型变量i,用于存放乘数,定义变量r存放乘积。Step2:初始化变量,i=1,r=1。Step3:判断r100000的值是否为真,若为真,转Step4,若为假,转Step6。Step4:将i加1,然后r=r*i。Step5:转Step3。Step6:循环结束,输出最后的乘数i。【例5-2】求阶乘#1.i=1#2.r=1#3.while r=100000:#4.r*=i#5.i=i+1#6.print(i)【例5-3】输入一个整数,求它的各位数字之和。#1.n=int(input()#2.sum=0#3.while n:#4.r=n%10#5.n=n/
4、10#6.sum+=r#7.print(sum=,sum)扩展while语句while 条件表达式:语句块1else:语句块2当条件表达式值为False则循环结束,且执行else后的语句块2若执行语句块1中的break语句结束循环,则不执行语句块2 else后必须加冒号 所有的语句块保持一致的缩进方式【例5-2】求阶乘#1.i=1#2.r=1#3.while r range(5)range(0,5)range(3,10,3)range(3,10,3)格式1:range(stop)生成从0开始到stop-1的连续整数,返回range对象格式2:range(start,stop,step)生成从s
5、tart开始到stop-1的、间隔为step的整数,返回range对象关于for循环的循环变量 循环变量是序列结构或可迭代对象的当前元素值的复制 修改循环变量的值,无法改变序列结构和可迭代对象的值 循环变量的变化次数是恒定不变的#1.x=1,2#2.for i in x:#3.print(i,end=)#4.i=i-3#5.print(i)#6.print(x)for循环中序列结构的元素减少#1.x=1,2,3,4#2.for i in x:#3.print(i,end=)#4.print(x.pop()#弹出最后的元素#5.print(x)#6.print(The loop end!)#7.
6、print(x)for循环中序列结构的元素增加(1)#1.x=1,2#2.for i in x:#3.print(i,end=)#4.if i!=5:x.append(5)#列表原地增加元素#5.print(x)#6.print(The loop end!)#7.print(x)for循环中序列结构的元素增加(2)#1.x=1,2#2.for i in x:#3.print(i,end=)#4.if i!=5:x=x+5#列表非原地增加元素#5.print(x)#6.print(The loop end!)#7.print(x)【例5-4】用for语句求1+2+3+99+100。#1.sum=
7、0#2.for i in range(1,101):#range()函数产生的数不包括101#3.sum+=i#4.print(sum)运行程序,结果如下:5050【例5-5】用for语句求一个整数的各位数字之和。#1.n=input(请输入一个整数:)#2.sum=0#3.for i in n:#4.sum+=int(i)#5.print(sum)请输入一个整数:38213【例5-6】编写程序找出所有三位水仙花数。所谓水仙花数是指其各位数字的立方和等于该数本身。例如,153=13+53+33,所以153是水仙花数。#1.for i in range(100,1000):#2.a,temp=d
8、ivmod(i,100)#3.b,c=divmod(temp,10)#4.if a*3+b*3+c*3=i:#5.print(i)5.3 循环控制语句5.3.1 break语句 循环体中使用break语句,可以跳出包含break语句的那层循环,从而提前结束该循环。跳出循环后,继续执行当前层循环的后续语句。【例5-7】输入一个正整数n,判断它是否为素数。素数就是只能被1和自身整除的数。判断n是否为素数,可以按素数的定义进行判断,用n依次除以2到n-1之间的所有数,只要发现有一个数能够被n整除,马上可以结束循环,判定n不是素数。如果没有一个能够被n整除的数,则n为素数。【例5-7】输入一个正整数n
9、,判断它是否为素数。#1.n=int(input(请输入一个整数:)#2.for i in range(2,n):#3.if n%i=0:#4.print(n,不是素数)#5.break#6.else:#7.print(n,是素数)5.3.2 continue语句 循环体中使用continue语句,可以提前结束本次循环体 不再执行本语句后循环体中的其他语句 跳回到循环结构首行,重新判断循环条件【例5-8】改用continue找所有三位水仙花数。#1.for i in range(100,1000):#2.a,temp=divmod(i,100)#3.b,c=divmod(temp,10)#4.
10、if a*3+b*3+c*3!=i:#5.continue#6.print(i)5.3.3 pass语句 pass语句又称空语句,执行pass语句时不做任何操作 用pass语句保证控制结构的完整性。模块化设计时,用pass语句占位。5.4 循环的嵌套循环嵌套 一个循环体内的语句中包含另一个循环语句,称为循环的嵌套。一个循环嵌套中包括外层循环和内层循环。内层循环可以继续循环嵌套,即为多层循环。较常用:双重循环和三重循环。循环嵌套的注意点 外循环每执行一次,内循环就要执行一个完整的循环 可以使用不同的循环语句相互嵌套,来解决复杂问题;使用break语句,只能跳出break语句所在那层的循环;嵌套循
11、环中注意语句的缩进,错误的缩进会使语句属于错误的循环层【例5-9】编制程序,打印如下九九乘法表。程序使用双重循环,定义两个循环变量i和j i用于控制外循环,即控制打印九九乘法表的行数 j用于控制内循环,即控制九九乘法表每一行打印的内容【例5-9】打印如下九九乘法表。#1.for i in range(1,10):#2.for j in range(1,i+1):#3.s=str(j)+*+str(i)+=+str(i*j)#4.print(s,end=)#5.print()【例5-10】求100以内的全部素数。将找到的素数按每行5个的形式输出在屏幕上 程序使用二重循环,定义两个循环变量i和j
12、i用于控制外循环,依次判断2到99是否为素数 j用于控制内循环,判断i是否能被j整除。【例5-10】求100以内的全部素数。#1.n=0#2.for i in range(2,100):#3.for j in range(2,i):#4.if i%j=0:#5.break#6.else:#7.print(i,end=t)#8.n+=1#n用来记录是否需要换行,每发现一个素数n+1#9.if n=5:#若n值为5则换行,并将n清零后,重新计数#10.n=0#11.print()5.5 循环结构程序举例【例5-11】用欧几里德算法求两个数的最大公约数 欧几里得算法 假设用gcd(m,n)表示m和n
13、的最大公约数,则gcd(m,n)必定等于gcd(n,m%n),直到m%n的结果为0。【例5-11】用欧几里德算法求两个数的最大公约数#1.m,n=eval(input(请输入一对整数m,n:)#2.while n:#3.m,n=n,m%n#4.print(m)【例5-12】猜数游戏 随机生成20以内的整数,用户输入整数猜测该数,程序提示输入数是偏大偏小还是正确。本题要用到随机生成数,需要先导入模块random,并利用其中的randint()函数生成指定范围的随机整数。【例5-12】猜数游戏#1.import random#2.goal=random.randint(1,20)#3.x=int(input(你猜:)#4.n=1#5.while x!=goal:#6.n+=1#7.if x goal:#8.x=int(input(偏大!再猜:)#9.elif x=fj:#12.print(最低年收入增长率是:.2%.format(r-1)#13.break清华大学出版社谢谢观赏谢谢观赏