Python循环从入门到精通:while、break、continue与嵌套实战

发布时间:2026/10/13 6:07:59
Python循环从入门到精通:while、break、continue与嵌套实战 循环是编程里最容易被低估的一块内容。很多人学Python卡在循环不是因为语法难而是因为脑子里没有程序是怎么一步步走的画面感。我见过太多人写while循环写出死循环把内存跑满也见过有人用for循环嵌套打印九九乘法表时对不齐格式抓耳挠腮。这篇笔记围绕Python循环体系展开从程序三大流程的底层逻辑讲起把while循环的基本用法、死循环的成因与利用、计数方法、循环计算、break与continue的控制逻辑、循环嵌套的执行过程一直到打印小星星和九九乘法表这两个经典练习全部拆开揉碎讲一遍。适合刚接触Python、对循环似懂非懂、或者写循环总是靠猜的读者。看完之后你应该能对循环每一步在干什么有一个清晰的画面而不是靠试错去凑结果。1. 程序的三大流程循环到底站在哪个位置1.1 顺序、分支、循环的分工任何一段程序不管多复杂拆到最底层都逃不出三种执行结构顺序、分支、循环。这不是Python独有的概念几乎所有编程语言都建立在这三种结构之上。顺序结构是最自然的——代码从上往下一行一行执行没有跳跃没有回头。你写a 1再写b 2再写print(a b)程序就老老实实按这个顺序走。这是默认状态不需要任何特殊语法。分支结构解决的是要不要做某件事的问题。比如判断一个数是不是正数是就打印正数不是就打印非正数。Python里用if / elif / else来实现。分支的本质是程序走到一个岔路口根据条件选择其中一条路继续走走完就汇合。循环结构解决的是要不要重复做某件事的问题。比如打印1到100你不可能写100行print这时候就需要循环。循环的本质是程序走到某一行之后发现条件还满足就跳回前面某一行重新执行直到条件不满足才继续往下走。这三者之间的关系我习惯用一个生活场景来类比你早上出门上班穿鞋、开门、下楼是顺序结构到了楼下看天气下雨就带伞不下就不带这是分支结构走到地铁站发现忘带工卡回去拿拿完再走一遍刚才的路这就是循环结构。理解这三者的定位很重要因为后面讲的所有循环细节——while、for、break、continue、嵌套——本质上都是在回答一个问题程序怎么跳、跳到哪、什么时候停。1.2 为什么循环是最容易出问题的一种结构顺序结构几乎不会出错分支结构最多是条件写错但循环结构不一样它引入了两个新的维度重复次数和终止条件。这两个维度一旦有一个没想清楚程序就会出问题。重复次数没想清楚可能导致该循环10次的循环了100次或者该循环的没循环。终止条件没想清楚轻则结果不对重则死循环——程序永远停不下来CPU占用飙升风扇狂转。我在带新手的时候发现一个规律能写好分支的人不一定能写好循环但能写好循环的人分支一定不会差。因为循环里面往往嵌套着分支循环的终止条件本身就是一个分支判断。所以循环是程序逻辑能力的一个分水岭。后面几节会围绕while循环展开把它的每一个零件都拆开看。for循环虽然也常用但while循环更能暴露你对条件和状态变化的理解是否到位所以先把它吃透for循环自然就通了。2. while循环的基本使用条件、循环体与状态变化2.1 while循环的语法骨架while循环的语法非常简洁while 条件: 循环体执行逻辑是先判断条件如果条件为真True执行循环体执行完循环体之后再次判断条件如果还是真继续执行循环体如此反复直到某一次判断条件为假False循环结束程序继续往下走。这里有一个非常关键的点条件是在每次执行循环体之前判断的不是之后。这意味着如果一开始条件就是假循环体一次都不会执行。这一点和后面会提到的某些语言里的do-while不一样Python的while是先判断后执行。举个最简单的例子i 1 while i 5: print(i) i i 1这段代码会打印1、2、3、4、5。执行过程是这样的i初始为1判断1 5为真打印1i变成2判断2 5为真打印2i变成3……直到i变成6判断6 5为假循环结束。2.2 循环体里必须有让条件趋向于假的操作上面那段代码里i i 1这一行是整个循环能停下来的关键。如果没有这一行i永远是1条件永远为真程序就死循环了。这是新手写while循环最容易犯的错误只写了循环体要做的事忘了写让条件变化的操作。我见过有人写一个倒计时程序循环体里只写了print(倒计时)忘了让计数器减一结果程序疯狂打印只能强制终止。所以写while循环的时候我建议你养成一个习惯先写条件再写循环体最后一定要检查循环体里有没有改变条件相关变量的语句。这个检查动作花不了几秒钟但能帮你避开90%的死循环问题。2.3 循环变量的初始值放在哪里循环变量比如上面例子里的i的初始值必须放在while之前。如果你放在循环体里面每次循环都会重新赋值条件就永远不会变。# 错误写法 while i 5: i 1 print(i) i i 1这段代码里每次进入循环体i都被重新赋值为1打印1然后变成2但下一次循环开始时又被重置为1永远在1和2之间打转条件永远为真。这种错误比忘记写i i 1更隐蔽因为代码看起来有变化但变化被重置了。正确的做法是把初始值放在循环外面i 1 while i 5: print(i) i i 1这个细节看起来简单但在实际写代码的时候尤其是循环体逻辑比较复杂的时候很容易不小心把初始化语句写进去。我的经验是循环变量的初始化永远紧挨着while那一行的上方不要隔太远也不要在循环体里出现。3. 死循环从bug到有意为之的工具3.1 死循环是怎么产生的死循环就是循环条件永远为真程序永远出不来。产生死循环的原因通常有三种第一种循环体里没有改变条件的语句。比如i 1 while i 5: print(i)i永远是1条件永远为真。第二种条件本身写错了永远为真。比如i 1 while i 0: print(i) i i 1i只会越来越大永远大于0条件永远为真。第三种循环体里的变化方向反了。比如本该减一的写成了加一i 5 while i 0: print(i) i i 1 # 本该是 i i - 1i从5开始越来越大永远大于0。这三种情况里第一种最常见第三种最隐蔽。因为第三种代码看起来有变化只是方向错了不仔细看逻辑的话不容易发现。3.2 死循环不一定是坏事虽然死循环通常是bug但在某些场景下我们故意写死循环。最典型的就是服务器一直运行等待请求这种场景——程序本来就应该一直跑着直到外部强制停止。在Python里故意写死循环通常用while True:。这个写法很直白条件永远为真循环永远执行。但注意故意写的死循环里面通常会有break语句用来在某个特定条件下跳出循环。比如while True: command input(请输入命令) if command quit: break print(你输入了 command)这个程序会一直等待用户输入直到用户输入quit才退出。这就是一个有意为之的死循环它靠break来控制退出而不是靠条件变化。3.3 死循环的排查思路如果你不小心写出了死循环程序卡住不动怎么排查我的经验是按这个顺序检查看循环条件里涉及的变量在循环体里有没有被修改。如果有修改看修改的方向对不对该减的有没有减该加的有没有加。看修改的语句有没有可能被跳过比如放在某个if分支里而那个分支没进去。看有没有在循环体里重新初始化了循环变量。这四步走下来基本能定位到问题。如果还找不到可以在循环体里加一句print(变量名)观察变量的变化通常打印几次就能看出问题。提示在调试循环的时候如果担心死循环可以先在循环体里加一个计数器循环超过一定次数就强制break避免程序卡死。4. 计数方法与循环计算让循环真正干活4.1 计数器的标准写法计数器是循环里最常见的模式之一。所谓计数器就是一个变量每次循环加一或减一用来记录循环了多少次或者用来控制循环的进度。标准写法是这样的count 0 while count 10: print(这是第, count 1, 次循环) count count 1这里count从0开始每次加一当count等于10的时候条件不满足循环结束。总共执行了10次。为什么从0开始而不是从1开始因为从0开始的话count的值正好等于已经执行的次数在数组索引等场景下更自然。当然从1开始也可以看具体需求。计数器的初始值、终止条件、每次的变化量这三个要素决定了循环的次数。比如count 0、count 10、count 1循环10次如果改成count 10、count 2那就只循环5次0、2、4、6、8。这个计算关系要清楚循环次数 (终止值 - 初始值) / 每次变化量在整除的情况下。4.2 累加与累乘循环计算的两种基本模式计数器是记录次数而累加和累乘是累积结果。累加是每次把新值加到总和上累乘是每次把新值乘到总积上。累加的标准写法total 0 i 1 while i 100: total total i i i 1 print(total) # 5050这段代码计算1到100的和。注意total的初始值是0因为加法的单位元是0。如果初始值写成别的结果就不对。累乘的标准写法product 1 i 1 while i 5: product product * i i i 1 print(product) # 120这段代码计算5的阶乘。注意product的初始值是1因为乘法的单位元是1。如果初始值写成0那不管乘什么都是0。这里有一个通用的原则累加的初始值是0累乘的初始值是1。这个原则看起来简单但新手经常搞混尤其是累乘的时候顺手写成0结果怎么算都是0。4.3 循环计算中的常见陷阱循环计算里有两个坑特别常见。第一个坑是把累加写在循环外面。比如total 0 i 1 while i 100: i i 1 total total i # 错误这行在循环外面这样total只会加一次结果是101而不是5050。累加的语句必须在循环体里面每次循环都执行。第二个坑是累加变量和循环变量搞混。比如i 0 while i 100: i i i # 错误把i自己加自己不是累加这里i每次翻倍0、0、0……直接死循环因为0加0还是0。正确的做法是用一个独立的变量来存总和。我的建议是循环变量和累加变量用不同的名字循环变量通常叫i、j、k累加变量叫total、sum、result。名字区分开就不容易搞混。5. break与continue循环里的两个遥控器5.1 break直接终止整个循环break的作用是立即跳出当前循环不管条件是否还满足循环直接结束程序继续执行循环后面的代码。i 1 while i 10: if i 5: break print(i) i i 1 print(循环结束)这段代码会打印1、2、3、4然后当i等于5的时候break执行循环直接结束打印循环结束。注意5本身没有被打印因为break在print之前。break的典型使用场景是找到目标就停。比如在一个列表里找某个数找到了就不需要继续找了用break跳出可以省掉后续无意义的循环。5.2 continue跳过本次继续下一次continue的作用是跳过当前这一次循环的剩余部分直接进入下一次循环的条件判断。i 0 while i 10: i i 1 if i % 2 0: continue print(i)这段代码打印1、3、5、7、9也就是所有的奇数。当i是偶数的时候continue执行跳过print直接进入下一次循环。注意continue和break的区别break是整个循环不干了continue是这一次不干了下一次继续。这个区别一定要分清楚用错了逻辑就完全不一样。5.3 break和continue在嵌套循环里的作用范围这是一个非常重要的细节break和continue只作用于它们所在的那一层循环不影响外层循环。i 1 while i 3: j 1 while j 3: if j 2: break print(i, j) j j 1 i i 1这段代码里内层循环的break只会跳出内层循环外层循环照常执行。结果是打印(1,1)、(2,1)、(3,1)。每次内层循环到j等于2的时候就break所以每个外层循环里内层只执行了一次。如果想让break跳出外层循环需要额外的标志变量或者用其他方式这个在嵌套循环那一节会详细讲。5.4 break和continue的常见误用最常见的误用是在continue之后写代码以为那些代码还会执行。比如i 0 while i 5: i i 1 if i 3: continue print(i) print(这行在continue之后)当i等于3的时候continue执行后面的两个print都不会执行。所以这行在continue之后这句话在i等于3的时候不会打印。continue之后的代码在本次循环里就是死代码不会被执行。另一个误用是用break代替continue。比如想跳过偶数结果写了break那就直接结束了后面的奇数也不会打印。这两个关键字虽然都是控制循环的但语义完全不同用之前一定要想清楚是跳过这一次还是结束整个循环。6. 循环嵌套两层循环的执行过程拆解6.1 嵌套循环的执行顺序循环嵌套就是循环里面还有循环。外层循环每执行一次内层循环完整地执行一遍。i 1 while i 3: j 1 while j 3: print(i, j) j j 1 i i 1这段代码的输出是1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3执行过程是这样的外层i等于1进入内层循环j从1到3打印(1,1)、(1,2)、(1,3)内层结束外层i变成2再次进入内层循环j重新从1开始注意j的初始化在内层循环里面每次外层循环都会重新初始化打印(2,1)、(2,2)、(2,3)以此类推。这里有一个关键点内层循环的初始化必须放在外层循环里面。如果放在外面j只会初始化一次内层循环在第一次外层循环之后就再也不会执行了。6.2 嵌套循环的总执行次数嵌套循环的总执行次数是各层循环次数的乘积。上面那个例子外层3次内层3次总共执行9次内层循环体。这个乘积关系在分析算法效率的时候非常重要。如果外层循环n次内层循环m次那内层循环体的执行次数就是n乘以m。如果两层都是n次那就是n的平方。这就是为什么嵌套循环在处理大数据量的时候要特别小心——次数是乘起来的不是加起来的。比如外层循环1000次内层循环1000次总共就是100万次。如果内层循环体里还有耗时的操作程序就会很慢。所以在写嵌套循环的时候要养成一个习惯先估算一下总执行次数如果太大就要考虑优化。6.3 嵌套循环里的变量命名嵌套循环里外层循环变量通常用i内层用j再往里用k。这是一个约定俗成的习惯几乎所有编程语言都这么用。为什么不都用i因为如果内外层都用i内层循环会覆盖外层的i导致外层循环的条件判断出错。比如i 1 while i 3: i 1 # 错误内层用了同名的i while i 3: print(i) i i 1 i i 1这段代码里内层的i把外层的i覆盖了外层循环的条件永远基于内层修改后的i逻辑完全乱套。所以嵌套循环一定要用不同的变量名。我的习惯是外层i内层j再内层k如果还不够用就用i1、i2、i3这种带编号的名字。名字本身不重要重要的是不要重复。7. 打印小星星循环嵌套的第一个实战7.1 需求拆解一行星星和一个矩形打印小星星是循环嵌套最经典的入门练习。最简单的需求是打印一个由星星组成的矩形比如5行5列***** ***** ***** ***** *****这个需求拆解一下总共5行每行5个星星。外层循环控制行数内层循环控制每行的星星数。i 1 while i 5: j 1 while j 5: print(*, end) j j 1 print() # 换行 i i 1这里有一个关键点print(*, end)里的end表示打印完不换行而是接着打印。如果不加这个参数每个星星都会单独占一行。内层循环结束后用一个空的print()来换行这样每一行的星星才会排在一起。7.2 进阶打印三角形矩形会了之后三角形就是改一下内层循环的次数。比如打印一个5行的直角三角形* ** *** **** *****规律是第i行有i个星星。所以内层循环的次数应该等于当前的行号。i 1 while i 5: j 1 while j i: print(*, end) j j 1 print() i i 1这里内层循环的条件是j ii是外层循环的变量所以每行的星星数随着行号增加。这就是嵌套循环里外层变量在内层被使用的典型场景。7.3 再进阶打印倒三角形和等腰三角形倒三角形就是反过来第i行有(6-i)个星星i 1 while i 5: j 1 while j 6 - i: print(*, end) j j 1 print() i i 1等腰三角形稍微复杂一点需要在星星前面打印空格。规律是第i行有(5-i)个空格然后有(2i-1)个星星。i 1 while i 5: # 打印空格 j 1 while j 5 - i: print( , end) j j 1 # 打印星星 k 1 while k 2 * i - 1: print(*, end) k k 1 print() i i 1这个练习的价值在于它强迫你把行号和每行的内容之间的关系用数学表达式写出来。这个能力在后续处理任何二维图形、表格、矩阵的时候都用得上。提示打印图形的时候如果对不齐先检查空格用的是半角还是全角再检查每行的空格数和星星数的公式对不对。我见过有人公式都对但因为用了全角空格怎么调都歪。8. 九九乘法表循环嵌套的综合性练习8.1 从需求到循环结构九九乘法表是打印小星星的升级版因为它每一行的内容不是固定的星星而是i乘以j等于积这样的表达式而且每一列的内容还不一样。标准的下三角九九乘法表长这样1*11 1*22 2*24 1*33 2*36 3*39 ...规律是第i行有i个表达式第j个表达式是j*i积。外层循环控制行数1到9内层循环控制每行的表达式数1到i。i 1 while i 9: j 1 while j i: print(f{j}*{i}{j*i}, end\t) j j 1 print() i i 1这里用了f-string来格式化输出\t是制表符用来对齐每一列。用\t而不是空格是因为制表符能自动对齐不管前面的数字是几位数。8.2 对齐问题的处理九九乘法表最容易出问题的地方就是对齐。如果不用\t而用空格当乘积从一位数变成两位数的时候列就会歪。比如111和11010宽度不一样用固定数量的空格对不齐。用\t可以解决大部分对齐问题因为制表符会跳到下一个制表位。但如果乘积的位数差异太大\t也可能对不齐。这时候可以用格式化字符串指定宽度比如f{j}*{i}{j*i:2d}:2d表示占2个字符宽度不足的补空格。i 1 while i 9: j 1 while j i: print(f{j}*{i}{j*i:2d}, end ) j j 1 print() i i 1这样每个乘积都占2个字符宽度列就整齐了。这个技巧在处理任何需要对齐的表格输出时都用得上。8.3 上三角和其他变体下三角会了之后上三角就是改一下内层循环的起始值。下三角的内层是从1到i上三角的内层是从i到9i 1 while i 9: j i while j 9: print(f{i}*{j}{i*j:2d}, end ) j j 1 print() i i 1还可以打印完整的矩形九九乘法表内层循环固定从1到9不管外层是几。这种变体的练习价值在于它让你思考内层循环的起止条件和输出内容之间的关系而不是死记硬背一个模板。8.4 用for循环实现九九乘法表虽然这篇笔记主要讲while循环但九九乘法表用for循环写会更简洁因为for循环天然适合遍历一个范围for i in range(1, 10): for j in range(1, i 1): print(f{j}*{i}{j*i:2d}, end ) print()range(1, 10)生成1到9range(1, i1)生成1到i。用for循环不需要手动初始化变量、手动加一代码更干净。这也是为什么实际开发中for循环用得比while循环多——当循环次数明确的时候for循环更省心。但while循环的价值在于它让你清楚地看到循环的每一个零件初始化、条件、变化理解了这些零件再用for循环就是水到渠成的事。反过来如果直接学for循环很多人只是记住了语法遇到复杂逻辑就不知道怎么拆了。9. 循环调试的几个实用技巧9.1 用print观察循环变量的变化调试循环最直接的方法就是在循环体里打印循环变量的值。比如i 1 while i 5: print(f当前i的值{i}) i i 1这样每次循环都会打印i的值你能清楚地看到i是怎么变化的循环是怎么推进的。如果发现i的值不对或者循环次数不对一眼就能看出来。这个方法看起来笨但非常有效。尤其是在嵌套循环里把外层和内层的变量都打印出来执行顺序一目了然。9.2 用计数器防止死循环在不确定循环会不会正常结束的时候可以加一个计数器超过一定次数就强制退出i 1 safety 0 while i 5: safety safety 1 if safety 100: print(循环次数异常强制退出) break print(i) i i 1这个技巧在调试复杂循环的时候特别有用能防止程序卡死。等确认循环逻辑正确之后再把安全计数器去掉。9.3 把循环逻辑写成表格对于嵌套循环我习惯在纸上或者注释里画一个表格列出外层变量和内层变量的每一组取值以及对应的输出。比如九九乘法表外层i内层j输出111*11211*22222*24311*33322*36333*39把前几行列出来规律就清楚了。这个方法在写复杂嵌套循环的时候能帮你理清思路避免靠试错去凑。9.4 循环变量的命名要能表达含义虽然i、j、k是约定俗成的循环变量名但如果循环的语义很明确用更有意义的名字会更好。比如打印九九乘法表外层变量叫row内层叫col代码的可读性会高很多row 1 while row 9: col 1 while col row: print(f{col}*{row}{col*row:2d}, end ) col col 1 print() row row 1这样一看就知道row是行col是列。在简单的循环里用i、j没问题但在逻辑复杂的循环里有意义的名字能帮你少犯错。10. 从while到for什么时候该换工具10.1 while适合的场景while循环适合循环次数不确定靠条件控制的场景。比如读取用户输入直到输入特定命令才停止。在一个列表里查找元素找到就停。模拟一个过程直到某个状态达成。这些场景的共同点是你不知道要循环多少次只知道什么时候该停。这时候while是自然的选择。10.2 for适合的场景for循环适合遍历一个已知范围或集合的场景。比如遍历一个列表的所有元素。循环固定次数比如打印1到100。遍历字符串的每个字符。这些场景的共同点是你知道要循环多少次或者你知道要遍历什么。这时候for更简洁。10.3 两者可以互相转换理论上任何for循环都可以用while循环改写反之亦然。比如for i in range(1, 6)等价于i 1 while i 5: # 循环体 i i 1但实际写代码的时候选更自然的那个。遍历集合用for条件控制用while。不要为了用while而用while也不要为了用for而用for。我个人的经验是新手阶段多用while把循环的每个零件都摸清楚熟练之后多用for因为代码更短更清晰。但不管用哪个底层的执行逻辑是一样的理解了whilefor就是换了个写法而已。循环这块内容光看是看不会的必须自己动手写。我的建议是把这篇笔记里的每个例子都敲一遍然后自己改改条件、改改变量看看输出有什么变化。尤其是九九乘法表试着用不同的方式实现——下三角、上三角、矩形、带对齐的、不带对齐的——每改一次你对循环的理解就深一层。写循环的时候脑子里要有一个程序在跳的画面而不是死记语法。这个画面感建立起来之后后面学任何跟循环相关的东西——列表推导式、生成器、迭代器——都会顺很多。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询