Python程序设计基础教程课件 第08章 循环结构_第1页
Python程序设计基础教程课件 第08章 循环结构_第2页
Python程序设计基础教程课件 第08章 循环结构_第3页
Python程序设计基础教程课件 第08章 循环结构_第4页
Python程序设计基础教程课件 第08章 循环结构_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章循环结构主要内容for循环while循环break和continue循环嵌套二维列表2for循环与while循环Python提供了两种循环结构,分别是for循环和while循环。for循环用于遍历序列(如列表、元组、字符串)或其他可迭代对象,执行指定的代码块。while循环用于在某个条件为真的情况下重复执行一段代码块。相同或不同的循环结构之间都可以互相嵌套,实现更为复杂的逻辑。38.1for循环4for

变量in

序列/可迭代对象:

循环体[else:

else子句]for循环语法:方括号内的else子句是可选的for循环流程:forxinseq: 循环体else: else子句5使用for循环时需要注意的要点:for循环适用于已知循环次数的场景,尤其适用于遍历一个序列或其他可迭代对象中的元素。for循环会自动遍历序列中的元素,变量x的值每次循环会自动更新。每次循环都要计算和比较序列的长度,如果在循环体中增加或删除了序列的元素,序列的长度也会相应地增加或减少。支持多变量同时赋值。6例1用for循环遍历列表中的每个元素,输出列表中的每个元素名称。fruits=['apple','banana','cherry']for

fruitinfruits:print(fruit)applebananaCherryperson={'name':'Dingli','age':20,'city':'Shanghai'}#对字典使用for循环,取到的值默认是字典的键forkinperson:#等同于forkinperson.keys():print("Keyis",k)#获取字典的值forvinperson.values():print("Valueis",v)#在for循环中使用2个变量,同时获取字典的键和值

fork,vinperson.items():print(k,":",v)KeyisnameKeyisageKeyiscityValueisDingliValueis20ValueisShanghainame:Dingliage:20city:Shanghai例2用for循环遍历字典中的每个元素,分别打印字典中键、值和键值对。9例3for循环支持多变量同时赋值,使用zip()函数中的元素进行多变量赋值。a=[1,2,3]b=['a','b','c']c=['张三','李四','王五']for

x,y,zinzip(a,b,c):print(x,y,z)#在for循环中使用2个变量,同时获取字典的键和值

1a张三2b李四3c王五

Enterastring:FudanUniversityFudanUniversity例4输入一个字符串,输出以空格间隔的字符序列。s=input('Enterastring:')str1=''foreachins:str1+=each+''print(str1)s=input('Enterastring:')foreachins:print(each,end='')方法二:方法一:12例5输入一个整数n,求Fibonacci数列的前n项。Fibonacci数列(0,1,1,2,3,5,8,13,21,..)从第3项开始,每一项都等于前两项之和。n=int(input("请输入您要生成的Fibonacci数列的项数:"))a,b=0,1foriinrange(n):print(a,end="")a,b=b,a+b请输入您要生成的Fibonacci数列的项数:1001123581321348.2while循环13while

条件表达式:

循环体[else:

else子句]while循环语法:方括号内的else子句是可选的使用while循环时需要注意的要点:循环条件的初始化和更新:在进入循环前,需要确保循环条件中的变量初始化已经完成,变量的更新也需要在循环体中进行。避免死循环:如果循环条件的判断不当或者循环体内没有更新循环条件,就可能会导致死循环。适用场景:while循环一般用于循环次数难以提前确定的情况,如需要满足某个条件时才停止循环的场景,也可以用于循环次数确定的情况。14例6用while循环遍历列表中的每个元素,输出列表中的每个元素名称。fruits=['apple','banana','cherry']for

fruitinfruits:print(fruit)applebananaCherryfruits=['apple','banana','cherry']i=0while

i<len(fruits):print(fruits[i])i+=1与例1相比,for循环语句更简洁例7输入一个正整数n,求从1到n各数平方和,例如输入的整数为15,则求12+22+32+…+142+152的值。请输入一个整数:15

124012401240n=int(input("请输入一个正整数:"))#方法一:用while循环i=1sum1=0whilei<=n:sum1=sum1+i*ii+=1#方法二:用for循环sum2=0foriinrange(1,n+1):sum2=sum2+i*i#方法三:用列表推导式产生n个整数的列表x=[i*iforiinrange(1,n+1)]sum3=sum(x)print(sum1,sum2,sum3)例8查找一个最小正整数,要求满足条件:被3除余2,被5除余3,被7除余4。关键:条件表达式的构造

num%3==2andnum%5==3andnum%7==453num=1

#从1开始检查whilenot(num%3==2andnum%5==3andnum%7==4):num+=1print(num)改用标志来控制循环num=1

#从1开始检查found=False#标志变量:是否已经找到whilenotfound:

ifnum%3==2andnum%5==3andnum%7==4:found=Trueelse:num+=1print(num)例9查找满足以下条件的前n个正整数:被3除余2,被5除余3,被7除余4。n由用户输入指定。total=int(input('Enteraninteger:'))keyList=[]

#存放结果的列表num=1

#从1开始检查count=0

#记录已经找到的合格数的个数whilecount<total:

ifnum%3==2andnum%5==3andnum%7==4:keyList.append(num)count+=1

num+=1#这条语句缩进会如何?print("这些数是:",end='')foreachinkeyList:print(each,end='')Enteraninteger:6这些数是:53158263368473578方法1:20total=int(input('Enteraninteger:'))keyList=[]num=1whilelen(keyList)<total:

ifnum%3==2andnum%5==3andnum%7==4:keyList.append(num)num+=1print("这些数是:",end='')foreachinkeyList:print(each,end='')方法2:省略保存合格数的个数count变量,用len(.)函数来计算列表长度。21total=int(input('Enteraninteger:'))

num=1

count=0print(“这些数是”,end=‘’)whilecount<total:

ifnum%3==2andnum%5==3andnum%7==4:

print(num,end='')#找到1个数,直接输出

count+=1

num+=1方法3:省略保存结果的keyList列表,找到合格的数据,直接输出。例10用户输入一个数,程序输出其平方数,重复上述过程,当用户输入0时,程序退出。Enteranumber:3(3)^2=9Enteranumber:2.5(2.5)^2=6.25Enteranumber:-3.2(-3.2)^2=10.240000000000002Enteranumber:0Goodbye!例10用户输入一个数,程序输出其平方数,重复上述过程,当用户输入0时,程序退出。x=eval(input('Enteranumber:'))

whilex:#x非零就循环

print('(',x,')^2=',x*x)x=eval(input('Enteranumber:'))

print('Goodbye!')例11计算1+2+3+…+9+10。i=1total=0whilei<=10:

total+=ii+=1print(total)total=0foriinrange(1,11):total+=iprint(total)total=0foriinrange(1,11):total+=I

i+=1

#会有什么影响print(total)55例12删除列表[1,2,1,2,1,1,1]中所有的1。x=[1,2,1,2,1,1,1]foriinx:

#i=x[index]

ifi==1:

x.remove(i)print(x)index<len(x)ifi==1:x.remove(i)print(x)Falseindex=0index=index+1i=x[index]True[2,2,1]列表x随着元素被删除而变化

每次循环处理的列表不一样.每插入/删除一个元素,该元素位置后面所有元素的索引都发生改变.for循环隐含的index不管列表是否变化,每次均自动增加1列表x(每次循环开始)隐含下标indexindex<len(x)i=x[index]列表x(每次循环结束)[1,2,1,2,1,1,1]00<7

True1[2,1,2,1,1,1][2,1,2,1,1,1]11<6

True1[2,2,1,1,1][2,2,1,1,1]22<5

True1[2,2,1,1][2,2,1,1]33<4

True1[2,2,1][2,2,1]44<3

False循环结束26x=[1,2,1,2,1,1,1]foriinx:

#i=x[index]

ifi==1:

x.remove(i)print(x)index<len(x)ifi==1:x.remove(i)print(x)Falseindex=0index=index+1i=x[index]True

x=[1,2,1,2,1,1,1]

i=0

whilei<len(x):

ifx[i]==1:

x.pop(i)#

在列表x中删除x[i]

else:

i=i+1

print(x)27方法1:使用while循环,用程序语句控制循环变量的变化。解决方法[2,2]列表x(每次循环开始)下标ii<len(x)x[i]列表x(每次循环结束)[1,2,1,2,1,1,1]00<7

True1[2,1,2,1,1,1][2,1,2,1,1,1]00<6

True2[2,1,2,1,1,1][2,1,2,1,1,1]11<6

True1[2,2,1,1,1][2,2,1,1,1]11<5

True2[2,2,1,1,1][2,2,1,1,1]22<5

True1[2,2,1,1][2,2,1,1]22<4

True1[2,2,1][2,2,1]22<3

True1[2,2][2,2]22<2

False循环结束28x=[1,2,1,2,1,1,1]

i=0

whilei<len(x):

ifx[i]==1:

x.pop(i)

else:

i=i+1

print(x)方法2:

从后往前遍历列表

x=[1,2,1,2,1,1,1]

n=len(x)#n=7

foriinrange(n-1,-1,-1):

ifx[i]==1:

x.pop(i)

#delx[i]29列表x(每轮循环开始)ix[i]列表x(每轮循环结束)[1,2,1,2,1,1,1]61[1,2,1,2,1,1][1,2,1,2,1,1]51[1,2,1,2,1][1,2,1,2,1]41[1,2,1,2][1,2,1,2]32[1,2,1,2][1,2,1,2]21[1,2,2][1,2,2]12[1,2,2][1,2,2]01[2,2][2,2]-1循环结束30方法3:仍然使用for循环,不在循环体中增加或删除了序列x的元素。[2,2]x=[1,2,1,2,1,1,1]y=[]foriinx:

#i=x[index]

ifi!=1:y.append(i)#将i添加到列表y中print(y)#x=y

#如果需要更新x,那么x=y,再输出x#print(x)8.3break/continue语句break和continue用于控制循环结构流程:break语句:当遇到break语句时,不管循环条件是否成立,立即退出所属层次的循环,并跳转到循环后面的语句。(对于循环嵌套,break只能退出一层循环,即break语句所属层次的循环)continue语句:跳过当次循环的剩余部分(忽略continue之后的语句),并立即进入下一次循环。31for循环while循环例13输入一个正整数n,求n以内能被17整除的最大正整数。num=int(input('输入一个正整数:'))foriinrange(num,0,-1):

ifi%17==0:print('%d以内能被17整除的最大正整数为%d'%(num,i))

breakelse:print('%d以内能被17整除的最大正整数无法找到'%num)输入一个正整数:500500以内能被17整除的最大正整数为493方法1:使用for循环输入一个正整数:1515以内能被17整除的最大正整数无法找到num=int(input('输入一个正整数:'))i=num

whilei%17:i-=1

ifi<17:print('%d以内能被17整除的最大正整数无法找到'%num)

break

else:print('%d以内能被17整除的最大正整数为%d'%(num,i))输入一个正整数:500500以内能被17整除的最大正整数为493方法2:使用while循环输入一个正整数:1515以内能被17整除的最大正整数无法找到例14判断一个数是否为素数。n=int(input('输入一个正整数(>1):'))flag=True

#flag为True-没有约数;为False-有约数i=2

#约数从2开始尝试whileflagandi<n:

#最多尝试到n-1

ifn%i==0:

#n能被i整除,说明n不是素数print('%d不是素数。'%n)

flag=False

#改变flag状态

else:i+=1

#尝试下一个数ifflag:

#循环结束,flag状态依然为True,说明n是素数print('%d是素数。'%n)输入一个正整数(>1):8989是素数。方法1:不用break,使用一个变量作为标志输入一个正整数(>1):123123不是素数。例14判断一个数是否为素数。n=int(input('输入一个正整数(>1):'))i=2

#约数从2开始尝试while

i<n:

#最多尝试到n-1

ifn%i==0:

#n能被i整除,说明n不是素数

print('%d不是素数。'%n)

break

#退出循环

else:

i+=1

#尝试下一个数else:#循环结束,flag状态依然为True,说明n是素数print('%d是素数。'%n)输入一个正整数(>1):8989是素数。方法2:使用break输入一个正整数(>1):123123不是素数。例15查找满足条件的最小正整数:被3除余2,被5除余3,被7除余4。(用break来实现例8)。num=1whileTrue:

#条件永远为真的循环

ifnum%3==2andnum%5==3andnum%7==4:

break

#找到就退出循环

else:#这个else与if对应num+=1#否则,考察下一个整数print(num)例8:num=1

#从1开始检查found=False

#标志变量:是否已经找到whilenotfound:

ifnum%3==2andnum%5==3andnum%7==4:found=Trueelse:num+=1print(num)53例16在例10中,输入一个数,程序输出其平方数;重复上述过程,当输入0时,程序退出。本示例要求当输入quit或exit时,退出程序。whileTrue:

#条件永远为真的循环x=input('Enteranumber:')ifx=="quit"orx=="exit":

break

#x为quit或exit时退出循环x=float(x)print('(',x,')^2=',x*x)print('Goodbye!')例10:Enteranumber:3(3.0)^2=9.0Enteranumber:-2.5(-2.5)^2=6.25Enteranumber:-1(-1.0)^2=1.0Enteranumber:quitGoodbye!x=eval(input('Enteranumber:'))whilex:

#x非零就循环

print('(',x,')^2=',x*x)x=eval(input('Enteranumber:'))print('Goodbye!')例17反复输入数据,当输入stop时,停止输入数据,计算已输入数据的总和,但是不计算负数。numbers=[]#保存输入的数据whileTrue:#条件永远为真的循环x=input('请输入一个数据(输入stop停止):')

ifx=="stop":

break

#x为stop时退出循环x=float(x)#将字符转换为浮点数

ifx<0:print('负数不参与计算。')

continue

#后面的else语句不再执行,转到while语句

else:numbers.append(x)#不是负数,保存到numbers[]print('这些数字是:')foreachinnumbers:print(each,end='')print('\n总和是:',sum(numbers))请输入一个数据(输入stop停止):10请输入一个数据(输入stop停止):-3.6负数不参与计算。请输入一个数据(输入stop停止):0请输入一个数据(输入stop停止):3.5请输入一个数据(输入stop停止):5请输入一个数据(输入stop停止):stop这些数字是:10.00.03.55.0总和是:18.5警惕continue使用中的问题:条件表达式中的变量有没有更新?如果变量没有更新,会进入死循环。

40i=0

while

i<15:

ifi%2==0:

continue

#i没有更新,死循环

print(i,end='')

i+=1foriinrange(10):

ifi%2==0:

continue

print(i,end='')例18输出满足0≤i<15的所有奇数i。i=0

whilei<15:

ifi%2==0:

i+=1

#更新i的值

continue

print(i,end='')

i+=1

#更新i的值i=-1

whilei<14:

i+=1#更新i的值

ifi%2==0:

continue

print(i,end='')1357911138.4循环嵌套循环嵌套是指在循环体内再嵌套另一个循环,用来实现多层循环控制。for循环和while循环都可以嵌套,即for循环体中包含for循环,while循环体中包含while循环。for循环和while循环还可以相互嵌套。内层循环的代码需要比外层循环的代码更缩进。41循环嵌套例19一个示例来说明循环嵌套的程序执行流程。i=0whilei<3:

#外循环

forjinrange(4):#内循环print("i=",i,"j=",j)#内循环体i=i+1i=0j=0i=0j=1i=0j=2i=0j=3i=1j=0i=1j=1i=1j=2i=1j=3i=2j=0i=2j=1i=2j=2i=2j=3例20假设共有鸡、兔30只,脚96只,求鸡、兔各有多少只?forcocksinrange(31):

forrabbitsinrange(31):heads=cocks+rabbitsfeet=cocks*2+rabbits*4ifheads==30andfeet==96:print('鸡有%d只,兔有%d只。'%(cocks,rabbits))鸡有12只,兔有18只。for

cocksinrange(1,31):ifcocks*2+(30-cocks)*4==96:print('鸡有%d只,兔有%d只。'%(cocks,30-cocks))方法1:使用循环嵌套方法2:不用循环嵌套,减少循环次数,提高计算效率例21水仙花数是指1个三位的十进制数,其各位数字的立方和等于该数本身。如:153是水仙花数,因为153=13+53+33。输出全部水仙花数。forhundredsinrange(1,10):#百位数范围1~9

fortensinrange(10):

forunitsinrange(10):n=hundreds*100+tens*10+unitsifunits**3+tens**3+hundreds**3==n:print(n)153370371407方法1:使用循环嵌套例21水仙花数是指1个三位的十进制数,其各位数字的立方和等于该数本身。如:153是水仙花数,因为153=13

+53+33。输出全部水仙花数。forninrange(100,1000):#100~999units=n%10tens=n//10%10hundreds=n//100ifunits**3+tens**3+hundreds**3==n:print(n)方法2:不使用循环嵌套嵌套循环嵌套中的break和continuebreak和continue只能作用在所属层次的循环上,无法对上层循环起作用。break只能退出一层循环,即break语句所属层次的循环。47break#跳出外层循环例22输入一个正整数,输出小于等于该正整数的全部质数。m=int(input('输入一个正整数(>1):'))print("小于等于%d的全部质数为:"%m)forninrange(2,m+1):#考察2~m之间的每个数n

foriinrange(2,n):#检查n是否有因子ifn%i==0:#只要n有一个因子,就不是质数

break

#不再继续检查n其他因子,退出内层for循环

else:#n没有因子,n就是质数print(n,end='')print()输入一个正整数(>1):53小于等于53的全部质数为:2357111317192329313741434753例23输入一个正整数,输出小于等于该正整数的最大质数。m=int(input('输入一个正整数(>1):'))forninrange(m,1,-1):

#从大到小考察m~2之间的每个数n

foriinrange(2,n):

#检查n是否有因子

ifn%i==0:

#只要n有一个因子,则不再继续检查n的其他因子

break

#退出内层for循环

else:#n没有因子,n就是要找的最大质数print("小于等于%d的最大质数为:%d"%(m,n))break

#退出外层for循环,结束整个循环嵌套输入一个正整数(>1):52小于等于52的最大质数为:47例24输出由1、2、3、4组成的每位数都不相同的所有三位数,一行显示5个数。digits=(1,2,3,4)count=0#计数器foriindigits:#枚举百位数

forjindigits:#枚举十位数

forkindigits:#枚举个位数ifi!=jandi!=kandj!=k:print(i*100+j*10+k,end='')count+=1ifcount%5==0:print()123124132134142143213214231234241243312314321324341342412413421423431432方法1:不采用continue例24输出由1、2、3、4组成的每位数都不相同的所有三位数,一行显示5个数。digits=(1,2,3,4)count=0foriindigits:

forjindigits:

ifi==j:

continue

forkindigits:

ifk==iork==j:

continue

print(i*100+j*10+k,end='')

count+=1

ifcount%5==0:print()方法2:采用continue循环结构优化合理使用break、continue语句可以优化循环结构,减少循环中不必要的计算操作,也可以避免不必要的循环次数。尽量减少循环内部不必要的计算,将与循环变量无关的代码尽可能地提取到循环之外。在循环嵌套中,应尽量减少内层循环中不必要的计算。52例25循环优化,减少内层循环中不必要计算的示例。importtimedigits=tuple(range(0,200))#优化前,所有的循环(共200*200*200次)都要做2次乘法和2次加法result=[]

#保存后面for循环生成的数据start=time.time()

#记录当前时间,即for循环开始时间foriindigits:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论