py编程基础及导论 3_第1页
py编程基础及导论 3_第2页
py编程基础及导论 3_第3页
py编程基础及导论 3_第4页
py编程基础及导论 3_第5页
已阅读5页,还剩98页未读 继续免费阅读

下载本文档

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

文档简介

第4章循环语句while循环·for循环·循环嵌套·break与continue面向师范生的Python编程导论本章概述2第4章循环语句循环语句让程序能够重复执行代码,是编程解决问题的核心工具4.1while循环while基础、计数器、累加器、冰雹猜想4.2for循环for基础、range()、求和、圆周率、质数4.3循环嵌套字符三角形、九九乘法表、break与continue本章学习目标4第4章循环语句知识目标理解while循环的执行流程掌握while循环的语法结构理解for循环的遍历机制掌握range()函数的三种用法理解循环嵌套的执行顺序掌握break和continue的作用能力目标能用while循环解决重复问题能用for循环进行数列求和能利用循环计算圆周率能设计质数判断程序能用嵌套循环输出图形能编写九九乘法表程序本章课时安排(4课时)6第4章循环语句课时教学内容重点/难点活动设计第1课时while循环基础与进阶循环条件与计数器概念讲解+编程实践第2课时for循环与range()函数range()参数理解任务驱动+代码调试第3课时圆周率计算与质数判断莱布尼茨公式项目实践+探究学习第4课时循环嵌套与break/continue嵌套循环执行顺序综合练习+测试提示建议每课时预留15分钟进行编程实践,循环语句需要大量动手练习才能熟练掌握。4.1while循环理解while循环的执行流程,掌握计数器与累加器的使用4.1.1为什么需要循环9第4章循环语句·4.1while循环问题:如何输出“床前明月光”100次?代码4.1#方法:重复写100次print()print("床前明月光")print("床前明月光")print("床前明月光")print("床前明月光")print("床前明月光")#...还需要95次注意如果要输出1000次、10000次呢?重复编写print()函数不仅烦琐,而且容易出错。我们需要更高效的方法!while循环语法11第4章循环语句·4.1while循环while循环语法while条件表达式:循环体(缩进的代码块)条件为True时重复执行循环体条件为False时退出循环与if语句的对比相同点:都有条件判断相同点:都用冒号和缩进不同点:if只执行1次不同点:while会重复执行while执行完循环体后会回到条件判断语法#while循环基本结构while条件表达式:循环体语句1循环体语句2...while循环示例:输出100次13第4章循环语句·4.1while循环代码4.2#使用while循环输出100次i=1whilei<=100:

print("床前明月光")i=i+1代码解析i=1:初始化计数器i<=100:循环条件print():循环体i=i+1:更新计数器执行过程i=1:1<=100为True,输出,i=2i=2:2<=100为True,输出,i=3...i=100:100<=100为True,输出i=101:101<=100为False,退出while循环执行流程15第4章循环语句·4.1while循环初始化变量↓判断条件↓执行循环体↓更新变量←循环回到条件判断条件为False退出循环条件为True→提示while循环的关键:每次执行完循环体后,都会回到条件判断部分重新判断。计数器模式17第4章循环语句·4.1while循环什么是计数器?计数器是一个用于记录循环执行次数的变量。通常在循环前初始化为某个值,在循环体中递增或递减,用于控制循环的执行次数。模板#计数器模式模板i=1

#初始化计数器whilei<=n:#使用计数器作为条件#循环体i=i+1

#更新计数器(重要!)计数器三要素初始化:i=1条件判断:i<=n更新:i=i+1注意如果忘记写i=i+1,计数器永远不变,循环条件永远为True,导致死循环!任务4.1:带序号输出19第4章循环语句·4.1while循环任务4.1请设计一个程序,输出“疑是地上霜”100次,并在每一行后面标注这是第几次。输出样例:疑是地上霜第1次疑是地上霜第2次...疑是地上霜第100次解题思路变量i正好对应输出的次数,记录了循环执行的次数只需在输出信息中添加i的值,使用f-string格式化输出参考代码4.3代码4.3:带序号输出21第4章循环语句·4.1while循环代码4.3#输出"疑是地上霜"100次,带序号i=1whilei<=100:

print(f"疑是地上霜第{i}次")i=i+1运行结果>>>疑是地上霜第1次>>>疑是地上霜第2次>>>疑是地上霜第3次...>>>疑是地上霜第100次提示思考:如果删除最后一行代码i=i+1,程序运行结果会发生什么变化?任务4.2:自定义输出次数23第4章循环语句·4.1while循环任务4.2请设计一个程序,读取用户输入的一个整数n,然后输出“疑是地上霜”n次,并在每一行后面标注这是第几次。代码4.4#输入数据print("请输入一个整数:")n=int(input())#循环输出i=1whilei<=n:

print(f"疑是地上霜第{i}次")i=i+1提示通过input()读取用户输入,将循环条件从固定的100改为变量n,实现灵活的次数控制。代码4.4运行结果25第4章循环语句·4.1while循环运行结果>>>请输入一个整数:6疑是地上霜第1次疑是地上霜第2次疑是地上霜第3次疑是地上霜第4次疑是地上霜第5次疑是地上霜第6次程序要点n的值由用户输入决定循环条件为i<=ni从1开始递增到n灵活性提升程序不再固定输出100次用户可以自由设定次数体现了程序的通用性累加器模式27第4章循环语句·4.1while循环什么是累加器?累加器是一个用于在循环中不断累加值的变量。通常在循环前初始化为0,在循环体中每次加上一个新值,最终得到累加结果。模板#累加器模式模板total=0

#初始化累加器为0i=1whilei<=n:total=total+i#累加i=i+1print(total)#输出累加结果累加器三要素初始化:total=0累加:total=total+x使用:输出total提示累加器是编程中最重要的模式之一,后续的求和、统计等程序都会用到。4.1.3棋盘的麦粒29第4章循环语句·4.1while循环古老的传说相传古印度宰相达依尔是国际象棋的发明者,国王要奖励他。达依尔要求在棋盘上按如下规律摆放麦子:第1格1粒,第2格2粒,第3格4粒,...,第n格2^(n-1)粒。格数麦粒数规律第1格12^0=1第2格22^1=2第3格42^2=4第4格82^3=8第n格2^(n-1)指数增长任务4.3国际象棋棋盘共有64格,1公斤麦子约5000粒,请设计程序计算国王大概需要奖励多少吨麦子。代码4.5:棋盘麦粒计算31第4章循环语句·4.1while循环代码4.5n=64i=1total=0cell=1whilei<=n:total=total+cell#在第i格摆上麦子cell=cell*2

#下一格的麦子数量i=i+1#将麦子数量转化为重量(单位为吨)total=total/5000/1000print(f"国王需要奖励给宰相达依尔{total}吨麦子!")变量说明total:记录麦粒总数cell:当前格的麦粒数关键操作total=total+cell(累加)cell=cell*2(倍增)棋盘麦粒结果分析33第4章循环语句·4.1while循环运行结果>>>国王需要奖励给宰相达依尔3689348814741.9106吨麦子!3.69万亿吨64格棋盘2^63第64格麦粒注意这是一个天文数字,甚至超出了2019年的全球小麦产量!指数增长的力量令人震惊。提示这同时说明:一旦发生指数型增长,一个很小的数字也能变得极大。任务4.4:小麦产量计算35第4章循环语句·4.1while循环任务4.4我国2021年小麦产量为131,696,392吨,请修改代码4.5,计算出2021年我国生产的小麦可以摆满国际象棋棋盘的多少格。代码4.6#估算我国2021年的小麦总粒数N=131696392*1000*5000n=64i=1total=0cell=1whilei<=n:total=total+cell

iftotal>N:

break

#终止循环cell=cell*2i=i+1print(f"可以摆满棋盘上{i-1}格!")break语句37第4章循环语句·4.1while循环break语句的作用break语句用于在循环没有结束时,提前终止循环。当满足某个条件时,使用break跳出当前循环,执行循环之后的代码。语法#break语句示例while条件1:

if条件2:

break

#满足条件2时,提前退出循环#其他代码#break后执行这里的代码使用场景查找某个值时找到即退出总量超过限制时停止注意break只跳出当前所在的那一层循环,嵌套循环中只跳出内层。4.1.4冰雹猜想39第4章循环语句·4.1while循环冰雹猜想(CollatzConjecture)任何一个正整数n,根据以下两条规则计算,最终都会得到数字1。这个猜想描述极为简单,但至今无人能证明或推翻。规则一:奇数如果n是奇数则下一步n变为n*3+1例如:3→10规则二:偶数如果n是偶数则下一步n变为n/2例如:10→5任务4.5请设计一个程序,读取一个正整数,根据冰雹猜想规则,输出每次转换的结果及总次数,验证最终是否变成1。代码4.7:冰雹猜想41第4章循环语句·4.1while循环代码4.7#输入数据print("请输入一个正整数:")n=int(input())#实施冰雹猜想规则i=1whilen!=1:

ifn%2==1:n=n*3+1

else:n=n//2

print(f"第{i}次转换后,n={n}")i=i+1关键点循环条件:n!=1奇偶判断:n%2==1整除运算:n//2提示尝试输入27,查看输出结果。思考是否还有更好的输出方式?冰雹猜想运行结果43第4章循环语句·4.1while循环运行结果>>>请输入一个正整数:3第1次转换后,n=10第2次转换后,n=5第3次转换后,n=16第4次转换后,n=8第5次转换后,n=4第6次转换后,n=2第7次转换后,n=13(奇)→10(偶)→5(奇)→16(偶)→8→4→2→1while循环常见错误45第4章循环语句·4.1while循环注意错误1:忘记更新计数器,导致死循环i=1whilei<=100:print(i)#缺少i=i+1,i永远是1,循环永不结束!注意错误2:循环条件写错,导致循环不执行或执行过多i=1whilei>=100:#条件从一开始就为Falseprint(i)i=i+1注意错误3:缩进错误,导致循环体不完整i=1whilei<=100:print(i)i=i+1#不在循环体内!导致死循环提示遇到死循环时,按Ctrl+C强制中断程序运行。while与if的对比47第4章循环语句·4.1while循环对比项if语句while循环条件判断有有冒号和缩进有有执行次数最多1次0次或多次执行完代码块后继续向下执行回到条件判断适用场景条件选择重复操作风险无可能死循环核心区别if语句执行完代码块后继续向下执行;while循环执行完代码块后会回到条件判断部分,如果条件仍为True则重复执行。4.1节小结49第4章循环语句·4.1while循环while循环基础while条件:循环体条件为True时重复执行条件为False时退出注意避免死循环两种重要模式计数器模式:i=1,whilei<=ni=i+1累加器模式:total=0total=total+x经典应用重复输出n次棋盘麦粒(指数增长)冰雹猜想验证break提前退出循环关键提醒必须更新循环变量注意循环条件的正确性死循环用Ctrl+C中断break可提前退出循环4.1节测验(一)51第4章循环语句·4.1while循环1.以下while循环执行几次?i=0whilei<5:i=i+1A.4次B.5次C.6次D.无限次2.以下代码输出什么?i=1whilei<=3:print(i)i=i+1A.123B.1234C.0123D.123.如果忘记在while循环中更新计数器,会发生什么?A.程序正常结束B.程序报错C.死循环D.只执行一次4.1节测验(二)53第4章循环语句·4.1while循环1.break语句的作用是什么?A.跳过本次循环B.提前终止循环C.继续下一次循环D.什么都不做2.冰雹猜想中,n=6时的下一步是多少?A.3B.18C.19D.123.棋盘麦粒问题中,第5格有多少粒麦子?A.8B.16C.32D.54.2for循环掌握for循环与range()函数,理解遍历机制,解决求和与圆周率计算问题4.2.1for循环基础56第4章循环语句·4.2for循环for循环简介Python的for循环用于遍历序列(sequence)数据类型,又被称为遍历循环。常见的序列包括:list、tuple、dictionary、set和str。代码4.8#for循环遍历列表names=["Emily","Jim","Sophia"]forxinnames:

print(x)执行过程for循环每次从序列中取出一个元素赋值给变量x,执行循环体,直到所有元素遍历完毕。for循环执行结果58第4章循环语句·4.2for循环运行结果>>>Emily>>>Jim>>>Sophiax=“Emily”→printEmily→x=“Jim”→printJim→x=“Sophia”→printSophiafor循环特点遍历次数由序列长度决定每次取出一个元素不需要手动更新计数器与while的区别for循环次数确定while循环次数可不确定for更适合遍历操作while循环与for循环对比60第4章循环语句·4.2for循环对比项while循环for循环循环次数不一定确定由序列长度决定条件判断需要手动写条件自动遍历序列计数器更新需要手动更新自动获取元素死循环风险有无(序列有限)适用场景次数不确定遍历/固定次数语法复杂度较复杂简洁提示选择建议:循环次数确定时用for循环,循环次数不确定时用while循环。4.2.2range()函数62第4章循环语句·4.2for循环range()函数简介range()函数用于生成一个整数等差数列,常与for循环配合使用,实现固定次数的循环。语法range(start,stop,step)参数含义默认值是否必需start数列起始值0否stop数列结束值(不包含)无是step公差(步长)1否注意stop参数是必需的,且生成的数列不包含stop值本身!range():一个参数64第4章循环语句·4.2for循环代码4.9#range(5)=range(0,5,1)#生成数列:0,1,2,3,4forxin

range(5):

print(x)运行结果>>>0>>>1>>>2>>>3>>>4提示当只有一个参数时,该参数就是stop的值,start默认为0,step默认为1。生成的数列从0开始,不包含stop。range():两个参数66第4章循环语句·4.2for循环代码4.10#range(1,5)=range(1,5,1)#生成数列:1,2,3,4forxin

range(1,5):

print(x)运行结果>>>1>>>2>>>3>>>4提示两个参数时,第一个是start,第二个是stop。生成的数列从start开始,不包含stop。range():三个参数68第4章循环语句·4.2for循环代码4.11#range(1,5,2)#生成数列:1,3(公差为2)forxin

range(1,5,2):

print(x)运行结果>>>1>>>3尝试设置step为负数设置start大于stop总结range(5)→0,1,2,3,4range(1,5)→1,2,3,4range()用法总结70第4章循环语句·4.2for循环用法生成的数列元素个数range(5)0,1,2,3,45range(1,5)1,2,3,44range(1,5,2)1,32range(5,0,-1)5,4,3,2,15range(0,10,3)0,3,6,94range(10)0,1,2,3,4,5,6,7,8,910提示关键公式:元素个数=ceil((stop-start)/step)。stop值永远不包含在数列中。4.2.3数列求和:高斯的故事72第4章循环语句·4.2for循环数学王子高斯高斯被认为是历史上最重要的数学家之一,享有“数学王子”之称。据说高斯10岁时,老师给出题目:计算1到100所有整数的和,高斯很快就给出了正确答案5050。高斯的方法1+100=1012+99=101...50+51=10150×101=5050计算机的方法不需要任何公式直接用循环逐个相加for循环是最适合的方法代码简洁易理解提示对于计算机来说,不需要数学公式,直接相加即可!这就是循环的威力。代码4.12:1到100求和74第4章循环语句·4.2for循环代码4.12#计算1到100的和n=100s=0forxin

range(1,n+1):s=s+xprint(s)运行结果>>>5050代码解析s=0:初始化累加器range(1,101):1到100s=s+x:累加操作注意思考:为什么range的第二个参数是n+1而不是n?因为range不包含stop值!奇数求和76第4章循环语句·4.2for循环代码4.13#计算1到100之间所有奇数的和n=100s=0forxin

range(1,n+1,2):s=s+xprint(f"1到{n}之间所有奇数之和为{s}")运行结果>>>1到100之间所有奇数之和为2500关键修改range(1,n+1,2)step=2只取奇数1,3,5,7,...,99提示思考:如果计算1到100之间所有偶数的和,如何修改程序?任务4.7:3或7的倍数求和78第4章循环语句·4.2for循环任务4.7请设计一个程序,用户输入一个正整数n,计算1到n之间所有3的倍数或7的倍数的总和。代码4.14print("请输入一个正整数n:")n=int(input())s=0forxin

range(1,n+1):

ifx%3==0

orx%7==0:s=s+xprint(s)关键点使用x%3==0orx%7==0判断倍数关系,取余运算符%是关键。任务4.7运行结果80第4章循环语句·4.2for循环运行结果>>>请输入一个正整数n:10022083的倍数3,6,9,12,...,99共33个无法用range直接生成7的倍数7,14,21,...,98共14个需要用if判断提示有些条件无法通过设置range()参数实现,需要在循环体内用if语句判断。累加求和模式总结82第4章循环语句·4.2for循环累加求和通用模板无论什么求和问题,都可以用统一的模式:初始化累加器为0,遍历每个数,满足条件就累加。模板#累加求和通用模板s=0forxin

range(起始,结束,步长):

if满足条件:s=s+xprint(s)问题range参数条件判断1到100求和range(1,101)无1到100奇数和range(1,101,2)无3或7的倍数和range(1,n+1)x%3==0orx%7==04.2.4计算圆周率π84第4章循环语句·4.2for循环圆周率π的历史圆周率π是圆的周长与直径的比值。公元263年,刘徽用“割圆术”计算到正192边形,得π≈3.14。祖冲之将其提升到3.1415926<π<3.1415927。到了近现代,辅以计算机,π的位数不断刷新。时期人物/方法精度公元263年刘徽(割圆术)π≈3.14南北朝祖冲之3.1415926~3.1415927近现代计算机辅助万亿位以上本节莱布尼茨公式逐步逼近本节蒙特卡洛方法随机模拟提示尝试:请上网查阅圆周率π的其他计算方法。莱布尼茨公式86第4章循环语句·4.2for循环莱布尼茨公式数学家莱布尼茨推导出的圆周率计算公式,是一个无穷级数,项数越多,结果越精确。π/4=1-1/3+1/5-1/7+1/9-1/11+1/13-...规律分析分子:都是1分母:奇数1,3,5,7,9...符号:奇数项正,偶数项负实现思路分母:2*x-1符号:x%2==0为负,否则为正最后乘以4得到π代码4.15:莱布尼茨计算π88第4章循环语句·4.2for循环任务4.8请设计一个程序,利用莱布尼茨公式计算圆周率,用户输入正整数n表示计算到第n项。代码4.15#输入数据print("请输入一个正整数n:")n=int(input())#计算圆周率pi=0forxin

range(1,n+1):

ifx%2==0:pi=pi-1/(2*x-1)

else:pi=pi+1/(2*x-1)pi=pi*4print(f"利用莱布尼茨级数计算{n}项,圆周率约为{pi}")莱布尼茨公式运行结果90第4章循环语句·4.2for循环运行结果>>>请输入一个正整数n:1000利用莱布尼茨级数计算1000项,圆周率约为3.140592653839794项数n计算结果与π的误差103.0418...约0.101003.1316...约0.0110003.1406...约0.001100003.1415...约0.00011000003.14158...更精确提示项数越多,结果越精确,但收敛速度较慢。这就是无穷级数的特点。4.2.5蒙特卡洛方法92第4章循环语句·4.2for循环蒙特卡洛方法(MonteCarloMethod)蒙特卡洛方法是一种利用计算机通过随机采样模拟解决问题的方法。我们可以利用它来计算圆周率π。基本原理正方形内切圆面积=π正方形面积=4面积比=π/4随机撒点,统计落入圆中的比例实现方法生成随机点(x,y)x,y∈(0,1)计算到圆心距离dd≤1则在圆内π≈4×(圆内点数/总点数)提示关键公式:圆面积/正方形面积=πr²/(2r)²=π/4代码4.16:蒙特卡洛计算π94第4章循环语句·4.2for循环代码4.16import

randomimport

math#输入数据print("请输入随机点数量:")n=int(input())#蒙特卡洛模拟m=0foriin

range(n):x=random.random()y=random.random()d=math.sqrt(x**2+y**2)

ifd<=1:m+=1#计算圆周率估算值pi=4*(m/n)print(f"模拟{n}次后,圆周率估算值={pi}")关键点random.random()生成(0,1)随机数,math.sqrt()计算平方根(勾股定理)。蒙特卡洛方法运行结果96第4章循环语句·4.2for循环运行结果>>>请输入随机点数量:100000模拟100000次后,圆周率估算值=3.14116>>>请输入随机点数量:100000模拟100000次后,圆周率估算值=3.13708结果特点每次运行结果不同因为是随机模拟点数越多越精确多次运行取平均更稳定与莱布尼茨对比莱布尼茨:确定性结果蒙特卡洛:随机性结果莱布尼茨:收敛慢但稳定蒙特卡洛:快速但波动两种圆周率计算方法对比98第4章循环语句·4.2for循环对比项莱布尼茨公式蒙特卡洛方法方法类型数学公式随机模拟结果性质确定性随机性每次结果相同可能不同收敛速度较慢中等代码复杂度简单稍复杂需要模块无random,math核心操作加减运算随机数+距离判断提示尝试:对比两种方法计算圆周率的精度与速度,思考各自的优势。4.2.6质数判断100第4章循环语句·4.2for循环什么是质数?质数(PrimeNumber),又称素数,是指只有1和它本身两个因数的自然数(不包括1)。即质数只能被1和它自身整除。2、3、5、7等都是质数。数字因数因数个数是否质数111否21,22是61,2,3,64否71,72是91,3,93否131,132是提示判断方法:计算因数个数,如果恰好为2,则是质数。代码4.17:质数判断102第4章循环语句·4.2for循环任务4.9请设计程序,用户输入一个正整数,程序判断这个数是否为质数,并输出判定结果。代码4.17#输入数据print("请输入一个正整数:")n=int(input())#计算因数个数k=0foriin

range(1,n+1):

ifn%i==0:k+=1#根据因数个数判断ifk==2:

print(f"{n}是质数。")else:

print(f"{n}不是质数。")质数判断运行结果104第4章循环语句·4.2for循环运行结果>>>请输入一个正整数:9797是质数。算法思路遍历1到n的所有数用n%i==0判断是否为因数统计因数个数kk==2则为质数性能问题大数判断较慢如73939133耗时很长需要遍历所有数可以优化:只检查到√n提示尝试:利用程序判断73939133是否为质数,思考如何优化程序速度。4.2节小结106第4章循环语句·4.2for循环for循环基础forxinsequence:遍历序列中每个元素不需要手动更新计数器循环次数由序列决定range()函数range(stop):0到stop-1range(start,stop)range(start,stop,step)stop值不包含在数列中经典应用数列求和(高斯问题)莱布尼茨公式计算π蒙特卡洛模拟计算π质数判断关键提醒range不包含stop值累加器要初始化为0蒙特卡洛结果有随机性大数质数判断效率低4.2节测验(一)108第4章循环语句·4.2for循环1.range(1,10,3)生成的数列是?A.1,4,7B.1,4,7,10C.1,3,6,9D.1,10,32.以下代码输出什么?forxinrange(3):print(x)A.123B.012C.0123D.123.莱布尼茨公式中第3项是什么?A.+1/5B.-1/5C.+1/3D.-1/74.2节测验(二)110第4章循环语句·4.2for循环1.蒙特卡洛方法计算π的原理是什么?A.数学公式推导B.随机采样模拟C.穷举所有可能D.递归计算2.以下哪个数是质数?A.9B.15C.21D.233.计算1到100的和,range参数应该写什么?A.range(1,100)B.range(1,101)C.range(0,100)D.range(100)4.3循环嵌套掌握循环嵌套的执行顺序,理解break与continue的区别4.3.1循环嵌套113第4章循环语句·4.3循环嵌套什么是循环嵌套?在解决某些问题时,一次循环无法实现,需要多重循环,即“循环嵌套”。一个循环的循环体中包含另一个循环。结构#嵌套循环结构foriin

range(n):#外层循环

forjin

range(m):#内层循环#内层循环体#外层循环体(内层循环结束后执行)执行顺序外层每执行1次,内层执行完整的m次注意嵌套循环总执行次数=外层次数×内层次数,注意效率问题!字符三角形问题115第4章循环语句·4.3循环嵌套目标:输出由字符组成的三角形目标输出XXXXXXXXXXXXXXX分析外层循环:控制行数(1到n)内层循环:输出每行字符第i行输出i个字符关键点print(c,end='')不换行print()输出空行(换行)end参数控制print行为代码4.18:字符三角形117第4章循环语句·4.3循环嵌套代码4.18#输入数据print("请输入行数n:")n=int(input())print("请输入一个字符:")c=input()#按照要求输出字符foriin

range(1,n+1):

forjin

range(i):

print(c,end='')

print()运行结果>>>请输入行数n:3请输入一个字符:XXXXXXX倒三角形问题119第4章循环语句·4.3循环嵌套目标:输出右对齐的三角形目标输出***************分析每行先输出空格空格数=n-i再输出i个字符关键修改内层增加空格循环forkinrange(n-i):print('',end='')代码4.19:倒三角形121第4章循环语句·4.3循环嵌套代码4.19#输入数据print("请输入行数n:")n=int(input())print("请输入一个字符:")c=input()#按照要求输出foriin

range(1,n+1):

forkin

range(n-i):

print("",end="")

forjin

range(i):

print(c,end='')

print()提示一个for循环中嵌入两个for循环,先输出空格再输出字符。也可以利用str的乘法运算简化:print(''*(n-i),end='')利用str乘法简化代码123第4章循环语句·4.3循环嵌套str类型与整数相乘前面的章节曾提到str类型可以与整数相乘,实现复制。我们可以利用这一特性简化字符三角形的代码。简化版#利用str乘法简化n=int(input("请输入行数n:"))c=input("请输入一个字符:")foriin

range(1,n+1):

print(""*(n-i),end="")

print((c+"")*i)简化效果只需一重循环即可实现提示思考:什么时候用嵌套循环,什么时候可以用str乘法替代?4.3.2求100以内的质数125第4章循环语句·4.3循环嵌套任务4.10请设计一个程序,输出100以内的所有质数。思路分析外层循环:遍历1到100内层循环:判断每个数是否为质数在代码4.17基础上添加外层循环嵌套结构forninrange(1,101):foriinrange(1,n+1):判断因数ifk==2:print(n)代码4.20m=100fornin

range(1,m+1):k=0

foriin

range(1,n+1):

ifn%i==0:k+=1

ifk==2:

print(f"{n}是质数")100以内质数运行结果127第4章循环语句·4.3循环嵌套运行结果>>>2是质数3是质数5是质数7是质数11是质数13是质数...89是质数97是质数100以内质数共25个质数最小质数:2最大质数:97优化方向让m由用户输入优化内层循环范围减少不必要的判断代码4.21:灵活的质数查找129第4章循环语句·4.3循环嵌套代码4.21#输入数据print("请输入一个正整数:")m=int(input())#逐个判断是否为质数fornin

range(1,m+1):k=0

foriin

range(1,n+1):

ifn%i==0:k+=1

ifk==2:

print(f"{n}是质数")注意注意:当m=1000000时,程序需要运行几分钟!多重循环导致计算量巨大,需要优化。循环嵌套的效率问题131第4章循环语句·4.3循环嵌套m的值外层循环次数内层总循环次数运行时间100100约5,000瞬间1,0001,000约500,000很快10,00010,000约50,000,000数秒100,000100,000约5,000,000,000很长1,000,0001,000,000约5000亿数分钟优化思路内层循环只检查到√n跳过偶数(除了2)使用break提前退出时间复杂度原始:O(n²)优化到√n:O(n√n)大大减少计算量break在嵌套循环中133第4章循环语句·4.3循环嵌套break的作用范围break语句只跳出当前所在的那一层循环,不影响外层循环的执行。示例#break只跳出内层循环foriin

range(3):

forjin

range(3):

ifj==1:

break

#只跳出内层forj

print(f"i={i},j={j}")#break后继续执行外层循环运行结果>>>i=0,j=0i=1,j=0i=2,j=0continue语句135第4章循环语句·4.3循环嵌套continue语句的作用continue语句用于跳过当前这一次循环的剩余代码,直接进入下一次循环。与break不同,continue不会终止循环。示例#continue示例:跳过偶数foriin

range(1,11):

ifi%2==0:

continue

#跳过偶数

print(i)运行结果>>>13579break与continue对比137第4章循环语句·4.3循环嵌套对比项breakcontinue作用终止循环跳过本次循环循环是否继续否,直接退出是,进入下一次执行位置循环体内循环体内嵌套影响只跳出当前层只跳过当前层本次典型用途找到目标即停止跳过不符合条件的对比示例#break:找到第一个3的倍数就停止foriin

range(1,20):

ifi%3==0:

print(f"找到:{i}")

break#continue:输出所有非3的倍数foriin

range(1,10):

ifi%3==0:

continue

print(i)九九乘法表139第4章循环语句·4.3循环嵌套九九乘法表九九乘法表是循环嵌套的经典案例。外层循环控制行(乘数),内层循环控制列(被乘数)。目标输出1x1=11x2=22x2=41x3=32x3=63x3=9...1x9=92x9=18...9x9=81规律第i行有i个乘法式j从1到i提示外层foriinrange(1,10),内层forjinrange(1,i+1)九九乘法表代码141第4章循环语句·4.3循环嵌套代码#九九乘法表foriin

range(1,10):

forjin

range(1,i+1):

print(f"{j}x{i}={i*j}",end="\t")

print()运行结果1x1=11x2=22x2=41x3=32x3=63x3=91x4=42x4=83x4=124x4=16...1x9=92x9=183x9=27...9x9=81代码解析外层i控制行(1-9),内层j控制列(1到i),end='\t'用制表符分隔,print()换行。4.3节小结143第4章循环语句·4.3循环嵌套循环嵌套基础外层循环控制行内层循环控制列外层1次,内层完整1轮总次数=外层×内层break与continuebreak:终止当前循环continue:跳过本次循环都只影响当前层循环嵌套中只跳出/跳过内层经典应用字符三角形输出100以内质数查找九九乘法表图形打印效率提醒嵌套循环计算量大注意优化内层循环善用break减少判断大数运算需特别关注4.3节测验145第4章循环语句·4.3循环嵌套1.以下嵌套循环共执行多少次内层循环体?foriinrange(3):forjinrange(4):A.7次B.12次C.3次D.4次2.break和continue的区别是什么?A.都是终止循环B.break终止循环,continue跳过本次C.continue终止循环,break跳过本次D.没有区别3.九九乘法表中,内层循环的范围是?A.range(1,10)B.range(1,i+1)C.range(i)D.range(1,i)本章总结while循环:条件为True时重复执行,需要手动更新计数器for循环:遍历序列元素,循环次数由序列长度决定range()函数:生成等差数列,range(start,stop,step)计数器模式:初始化、条件判断、更新三要素累加器模式:初始化为0,循环中不断累加break语句:提前终止当前循环continue语句:跳过本次循环的剩余代码循环嵌套:外层控制行,内层控制列莱布尼茨公式和蒙特卡洛方法都可以计算圆周率质数判断:统计因数个数,恰好为2则是质数关键术语148第4章循环语句术语英文说明while循环whileloop条件为True时重复执行的循环for循环forloop遍历序列元素的循环range()函数range()function生成整数等差数列计数器counter记录循环执行次数的变量累加器accumulator在循环中累加值的变量循环嵌套nestedloop循环体中包含另一个循环break语句breakstatement提前终止循环continue语句continuestatement跳过本次循环蒙特卡洛方法MonteCarloMethod随机采样模拟方法质数PrimeNumber只有1和自身两个因数的数课后习题150第4章循环语句习题1:水仙花数水仙花数是一个三位数abc,各位数字立方和a³+b³+c³等于自身。如153是水仙花数,因为1³+5³+3³=153。请输出100到999之间所有水仙花数。习题2:最大公约数输入两个正整数a和b,设计一个程序计算它们的最大公约数。习题3:最小公倍数输入两个正整数a和b,设计一个程序计算它们的最小公倍数。习题4:完全数若某自然数的所有小于自身的因数之和恰好等于自身,则称为完全数。求n以内所有完全数。如6=1+2+3。习题5:逢7过找出1~n中能被7整除或包含数字7的数的个数,如14、275等。下章预告152第4章循环语句第5章:数据类型进阶下一章我们将学习Python中更丰富的数据类型,包括list列表、tuple元组、dict字典和str字符串。这些数据类型与循环语句结合,将大大增强我们编程解决问题的能力。本章核心技能while循环与for循环range()函数循环嵌套break与continue下章新内容list列表的创建与操作tuple元组的特点dict字典的键值对str字符串的方法提示建议在开始下一章前,确保能熟练编写while循环和for循环程序。while循环模式总结154第4章循环语句计数器模式i=1;whilei<=n:...;i=i+1—用于固定次数的重复累加器模式total=0;while...:total=total+x—用于求和、统计条件循环模式while条件:...—循环次数不确定,如冰雹猜想break退出模式whileTrue:if条件:break—满足条件时退出指数增长模式cell=cell*2—每次循环翻倍,如棋盘麦粒问题for循环模式总结156第4章循环语句遍历序列forxinsequence:...—遍历列表、元组、字符串等固定次数循环foriinrange(n):...—执行n次循环带步长循环foriinrange(start,stop,step):...—按步长遍历条件筛选循环forxin...:if条件:...—遍历并筛选满足条件的元素嵌套循环foriin...:forjin...:...—多维遍历循环常见错误总结158第4章循环语句注意错误1:死循环忘记更新循环变量,导致条件永远为True。解决:确保循环体中有更新计数器的语句。注意错误2:range()参数错误range(1,100)只到99!计算1到100的和应写range(1,101)。记住stop不包含在内。注意错误3:缩进错误循环体内的语句必须正确缩进。缩进错误会导致语句不在循环体内,或语法错误。注意错误4:忘记冒号while条件和for语句末尾必须有冒号(:),这是Python语法要求。注意错误5:break/continue混淆break终止循环,continue跳过本次。用错会导致逻辑错误。循环调试技巧160第4章循环语句技巧1:打印变量在循环体内print变量观察每次循环的变化确认循环是否正常执行技巧2:减少次数先用小数据测试如将100改为5确认逻辑正确后再加大技巧3:边界检查检查第1次和最后1次检查循环条件边界如i<=n还是i<n技巧4:Ctrl+C死循环时按Ctrl+C强制中断程序然后检查循环条件提示养成先用小数据测试,再放大规模的调试习惯,能大大提高编程效率。本章代码汇总162第4章循环语句代码编号内容知识点4.1重复print方法为什么需要循环4.2while输出100次while基础语法4.3带序号输出f-string+计数器4.4自定义次数输出input+while4.5棋盘麦粒累加器+指数增长4.6小麦产量break语句4.7冰雹猜想while+if-else4.8遍历列表for循环基础4.9-4.11range()三种用法range()参数4.12-4.14数列求和累加器模式4.15莱布尼茨公式for+数学公式4.16蒙特卡洛方法random+for4.17质数判断因数计数4.18-4.19字符三角形循环嵌套4.20-4.21100以内质数嵌套循环while循环深入理解164第4章循环语句循环三阶段初始化阶段:设置变量初始值条件判断阶段:检查是否继续更新阶段:改变循环变量适用场景循环次数不确定时需要满足某个条件才停止如冰雹猜想n!=1如读取数据直到结束通用模板#while循环的通用模板#1.初始化变量=初始值#2.条件判断while条件:#3.循环体执行操作#4.更新(重要!)更新变量for循环深入理解166第4章循环语句for循环优势语法简洁,不易出错不需要手动更新计数器不会出现死循环天然适合遍历操作range()技巧range(n):0到n-1range(1,n+1):1到nrange(n,0,-1):倒序range(0,n,2):偶数常见用法#for循环的常见用法#1.固定次数foriin

range(10):

print(i)#2.指定范围foriin

range(1,101):s+=i#3.带步长foriin

range(0,100,2):

print(i)#偶数#4.倒序foriin

range(10,0,-1):

print(i)#10到1练习:阶乘计算168第4章循环语句任务练习请设计一个程序,读取用户输入的正整数n,计算n的阶乘(n!)。阶乘定义:n!=1×2×3×...×n。例如5!=120。提示使用累乘器(类似累加器)初始化result=1result=result*i可用for或while循环参考代码#参考答案n=int(input("请输入n:"))result=1foriin

range(1,n+1):result=result*iprint(f"{n}!={result}")提示累乘器与累加器的区别:累乘器初始化为1,累加器初始化为0。练习:斐波那契数列170第4章循环语句任务练习斐波那契数列:1,1,2,3,5,8,13,21,...每个数等于前两个数之和。请输出前n个斐波那契数。参考代码#斐波那契数列n=int(input("请输入n:"))a,b=1,1print(a,b,end="")foriin

range(3,n+1):c=a+b

print(c,end="")a=bb=c关键点a,b=b,c是Python的多重赋值,同时更新两个变量。练习:猜数字游戏172第4章循环语句任务练习设计一个猜数字游戏:程序随机生成1-100的整数,玩家反复猜测,程序提示“大了”或“小了”,直到猜对为止,输出猜测次数。参考代码import

randomanswer=random.randint(1,100)count=0while

True:guess=int(input("猜一个数(1-100):"))count+=1

ifguess>answer:

print("大了")

elifguess<answer:

print("小了")

else:

print(f"猜对了!共猜了{count}次")

break练习:打印菱形174第4章循环语句任务练习请用循环嵌套输出以下菱形图案(n=5,n为奇数表示中间行星号数):*************参考代码#打印菱形n=5#上半部分(含中间行)foriin

range(1,n//2+2):

print(""*(n//2-i+1),end="")

print("*"*(2*i-1))#下半部分foriin

range(n//2,0,-1):

print(""*(n//2-i+1),end="")

print("*"*(2*i-1))提示利用str乘法可以大幅简化代码,避免嵌套循环。综合测验(一)176第4章循环语句1.以下哪个循环会输出01234?A.foriinrange(1,5):print(i)B.foriinrange(5):print(i)C.foriinrange(0,5,2):print(i)D.foriinrange(5,0):print(i)2.whileTrue:表示什么?A.循环执行1次B.死循环(除非有break)C.循环不执行D.语法错误3.以下代码输出什么?s=0foriinrange(1,5):s+=iprint(s)A.10B.15C.6D.4综合测验(二)178第4章循环语句1.continue语句的作用是?A.终止循环B.跳过本次循环剩余代码C.跳出函数D.重新开始循环2.以下代码输出什么?foriinrange(1,6):ifi%2==0:continueprint(i)A.24B.135C.12345D.2463.棋盘麦粒问题中,第10格有多少粒麦子?A.256B.512C.1024D.10如何选择循环类型180第4章循环语句用while循环循环次数不确定需要满足某条件才停止如:冰雹猜想n!=1如:猜数字直到猜对如:读取数据直到结束用for循环循环次数确定需要遍历序列如:输出1到100如:遍历列表元素如:九九乘法表次数确定?→用for循环→用while循环提示大部分情况下,能确定次数就用for循环,更安全更简洁。whileTrue循环模式182第4章循环语句whileTrue模式whileTrue创建一个无限循环,通常与break配合使用,在满足条件时退出循环。这种模式在需要先执行再判断的场景中非常实用。示例#whileTrue+break模式while

True:user_input=input("请输入(q退出):")

ifuser_input=='q':

温馨提示

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

评论

0/150

提交评论