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

发布时间:2026/10/13 1:35:13
Python循环从入门到精通:while循环、死循环与嵌套实战 1. 从零拆解Python循环为什么它是编程入门的分水岭刚接触Python的朋友学到循环这一块往往会经历一个明显的分水岭。前面学变量、数据类型、条件判断感觉都还能应付代码一行行往下跑逻辑清晰。可一旦进入循环尤其是while和for混着用加上break、continue、嵌套循环脑子就开始不够用了。我当初自学的时候光是一个九九乘法表就折腾了整整一个下午打印出来的格式歪歪扭扭要么多一行要么少一列。后来带过不少新人发现大家在循环这块踩的坑出奇地一致。所以这篇笔记我想把Python循环相关的基础知识点结合我自己的实操经验系统地梳理一遍。不管你是刚学编程的小白还是想回头巩固基础的开发者应该都能从中找到一些有用的东西。循环的本质是什么说白了就是让计算机重复做一件事。人类最讨厌重复劳动但计算机最擅长这个。你告诉它“把这句话打印一百遍”它就老老实实打印一百遍不会偷懒也不会抱怨。Python里实现循环主要有两种方式while循环和for循环。while循环适合那种“不知道要循环多少次只知道循环条件”的场景for循环则适合“明确知道要遍历一个序列或者循环固定次数”的场景。这篇文章重点聊while循环因为它是理解循环逻辑的最佳切入点也是新手最容易写出死循环的地方。程序的三大流程——顺序、分支、循环——是编程逻辑的基石。顺序就是代码从上到下依次执行分支就是if-else那套根据条件走不同路径循环则是让某段代码反复执行。这三者组合起来就能表达几乎所有的程序逻辑。很多人觉得编程难其实难的不是语法而是如何把现实问题拆解成这三种流程的组合。循环在其中扮演的角色就是处理“重复”和“批量”的问题。没有循环你处理一百个数据就得写一百行代码那编程就没法玩了。这篇文章我会从while循环的基本语法讲起然后聊死循环是怎么产生的、怎么避免接着是计数方法和循环计算再深入break和continue的用法最后用打印小星星和九九乘法表这两个经典案例来实战嵌套循环。每个部分我都会配上可直接运行的代码和详细的解释还会分享一些我在实际编码中总结的避坑技巧。你完全可以跟着文章里的代码一行行敲一遍效果比光看要好得多。2. while循环基本使用语法、执行流程与核心要点2.1 while循环的语法结构与执行逻辑while循环的语法非常简单核心就三部分关键字while、条件表达式、冒号然后缩进的循环体。写法如下while 条件表达式: 循环体代码 循环体代码执行逻辑是这样的程序先判断条件表达式是True还是False。如果是True就执行循环体里的代码执行完之后再回到条件表达式重新判断。如此反复直到条件表达式变成False循环结束程序继续往下走。这个“判断-执行-再判断”的过程就是循环的核心机制。我举个最简单的例子打印1到5i 1 while i 5: print(i) i 1这段代码的执行过程i初始为1判断1 5为真打印1i变成2再判断2 5为真打印2i变成3……直到i变成6判断6 5为假循环结束。最终输出1、2、3、4、5。这里有个关键点i 1这行代码绝对不能少。如果漏了它i永远是1条件永远为真程序就会陷入死循环一直打印1直到你强制终止。这是新手最常犯的错误之一。2.2 循环变量的初始化与更新两个不能忘的步骤写while循环有两件事必须做对循环变量的初始化以及循环变量的更新。初始化是在循环开始之前给变量一个初始值更新是在循环体里改变这个变量的值让条件最终能变成False。我见过不少初学者写着写着就忘了更新变量或者更新写错了位置。比如下面这个错误示例i 1 while i 5: print(i) # 忘记写 i 1这段代码会无限打印1。还有一种情况是更新写在了循环体外面i 1 while i 5: print(i) i 1这样i只加了一次循环体里i始终是1同样死循环。正确的做法是把更新语句放在循环体内部并且确保每次循环都会执行到。提示写while循环时先想清楚“循环什么时候结束”然后确保循环体里有代码能让这个结束条件达成。这是避免死循环的黄金法则。2.3 条件表达式的常见写法与陷阱while后面的条件表达式可以是任何能返回布尔值的表达式。常见的有比较运算、、、!、逻辑运算and、or、not甚至直接用一个变量。比如flag True while flag: user_input input(输入点什么输入q退出) if user_input q: flag False这种写法用布尔变量控制循环在交互式程序里很常见。但要注意条件表达式里如果用了and或or要小心短路求值带来的意外。比如while i 10 and j 0:如果i 10已经是False后面的j 0就不会被计算。大多数时候这没问题但如果后面的表达式有副作用比如函数调用就可能出问题。另一个陷阱是浮点数的比较。while x ! 0.1:这种写法很危险因为浮点数精度问题x可能永远不等于0.1导致死循环。涉及浮点数时最好用范围判断比如while abs(x - 0.1) 1e-9:。3. 死循环从灾难到利器的认知转变3.1 死循环是怎么产生的死循环就是循环条件永远为真程序永远跳不出循环体。产生的原因主要有三种一是忘了更新循环变量二是更新方向搞反了三是条件表达式本身永远为真。第一种最常见前面已经举例。第二种比如i 10 while i 0: print(i) i 1 # 应该是 i - 1i越来越大永远大于0死循环。第三种比如while True:这是故意写的死循环后面会讲它的用途。死循环的危害在于它会占满CPU的一个核心程序卡死只能强制终止。在IDE里可以点停止按钮在命令行里得按CtrlC。如果死循环里还有打印操作屏幕会瞬间被刷爆甚至可能把日志文件撑满磁盘。我早期写爬虫的时候就因为一个死循环没注意跑了一晚上第二天发现日志文件几十个G磁盘直接爆了。3.2 如何快速定位和避免死循环定位死循环的方法在循环体里加打印看循环变量有没有按预期变化。比如在i 1后面加一行print(i , i)运行一下就能看出问题。或者用调试器单步执行观察变量值。避免死循环的经验写while循环时先把循环变量的初始值、结束条件、更新语句这三样东西写出来再填循环体的逻辑。我个人的习惯是只要写while第一件事就是写更新语句哪怕逻辑还没想好先把i 1写上这样至少不会死循环。注意如果循环体里有continue要确保continue之前循环变量已经更新了否则continue会跳过更新语句导致死循环。这个坑很隐蔽后面讲continue时会详细说。3.3 故意使用死循环的合理场景死循环不全是坏事。有些场景下我们就是需要程序一直运行直到某个外部条件触发退出。比如服务器的主循环、游戏的事件循环、交互式菜单程序。这时候用while True:配合break是标准写法while True: command input(请输入命令q退出) if command q: break print(执行命令, command)这种写法比用一个布尔变量控制更直观因为退出条件写在循环体内部逻辑更集中。while True本身不是问题问题是你有没有在合适的地方break出来。4. 计数方法与循环计算让循环真正干活4.1 计数器的标准写法与常见变体计数器是循环里最常用的模式。标准写法是初始化一个变量为0循环体里每次加1。比如统计1到100里有多少个偶数count 0 i 1 while i 100: if i % 2 0: count 1 i 1 print(偶数个数, count)这里count就是计数器。变体有很多比如倒计数从10减到1、步长不为1的计数每次加2、条件计数满足某个条件才加1。计数器的初始值不一定是0根据场景可以是任意值。关键是理解“累加”这个动作。我刚开始学的时候经常把计数器和累加器搞混。计数器是统计个数每次加1累加器是求和每次加上一个变化的值。比如求1到100的和用的是累加器total 0 i 1 while i 100: total i i 1 print(总和, total)total每次加的是i不是1。这个区别看似简单但新手很容易写错。4.2 循环计算累加、累乘与统计循环计算的核心思想是把每次循环的结果累积到一个变量里。累加用累乘用*。比如计算5的阶乘result 1 i 1 while i 5: result * i i 1 print(5的阶乘, result)注意累乘的初始值必须是1不能是0否则结果永远是0。累加的初始值通常是0。这个初始值的选择取决于运算的单位元加法单位元是0乘法单位元是1。除了累加累乘循环还可以做统计比如求最大值、最小值、平均值。求最大值时先把第一个数设为最大值然后逐个比较numbers [3, 7, 2, 9, 5] max_val numbers[0] i 1 while i len(numbers): if numbers[i] max_val: max_val numbers[i] i 1 print(最大值, max_val)这种模式在处理批量数据时非常有用。实际工作中从文件读取数据、从接口获取列表然后循环处理都是这个套路。4.3 循环计算中的精度与边界问题循环计算有几个容易踩的坑。一是整数溢出Python的整数理论上没有上限所以不用担心溢出但其他语言要注意。二是浮点数精度累加很多个浮点数时误差会累积。比如0.1 0.2不等于0.3循环累加一百次0.1结果可能不是10。解决办法是用decimal模块或者先转成整数计算再转回来。三是边界条件。比如循环从1到100条件是i 100还是i 100差一个数。写循环时我习惯在纸上画一下第一次和最后一次循环的情况确认边界对不对。这个习惯帮我省了很多调试时间。5. break与continue循环控制的两个关键开关5.1 break立即跳出循环break的作用是立即终止当前循环程序跳到循环后面的代码继续执行。它通常和if配合使用在满足某个条件时提前结束循环。比如猜数字游戏target 7 while True: guess int(input(猜一个1-10的数字)) if guess target: print(猜对了) break print(猜错了再试试)这里while True是死循环但break在猜对时跳出来。break只会跳出它所在的那一层循环如果有多层嵌套它只跳出最内层。这一点后面讲嵌套循环时会再强调。break的一个常见用途是优化性能。比如在一个大列表里查找某个元素找到就可以停了不需要继续遍历names [张三, 李四, 王五, 赵六] target 王五 i 0 while i len(names): if names[i] target: print(找到了索引是, i) break i 1如果不加break找到之后还会继续遍历剩下的元素浪费计算资源。5.2 continue跳过本次循环剩余代码continue的作用是跳过本次循环中continue后面的代码直接进入下一次循环的条件判断。注意它不会终止整个循环只是跳过当前这一轮。比如打印1到10里的奇数i 1 while i 10: if i % 2 0: i 1 continue print(i) i 1这里遇到偶数就continue不打印。但注意我在continue之前写了i 1这是必须的。如果写成i 1 while i 10: if i % 2 0: continue # 危险i没有更新 print(i) i 1当i变成2时continue跳过了后面的i 1i永远是2死循环。这是continue最经典的坑。我的建议是用continue时要么把更新语句放在continue之前要么用for循环代替while因为for循环的迭代器会自动推进不存在这个问题。5.3 break与continue的对比与选用break和continue的区别可以用一句话概括break是“不玩了走人”continue是“这轮不算下一轮”。选用哪个取决于你的逻辑需求。如果满足条件后整个循环都没必要继续了用break如果只是当前这个元素不需要处理但后面的还要继续用continue。我个人的经验是continue要慎用因为它容易让代码逻辑变得跳跃可读性下降。很多时候用if-else把逻辑反过来写比用continue更清晰。比如上面打印奇数的例子可以写成i 1 while i 10: if i % 2 ! 0: print(i) i 1这样没有continue逻辑更直白。当然如果循环体很长continue能减少缩进层级也有它的价值。关键是团队里要统一风格。6. 循环嵌套从打印小星星到九九乘法表6.1 嵌套循环的执行逻辑与设计思路嵌套循环就是循环里面还有循环。外层循环每执行一次内层循环完整执行一遍。比如i 1 while i 3: j 1 while j 3: print(f({i},{j}), end ) j 1 print() # 换行 i 1输出是(1,1) (1,2) (1,3) (2,1) (2,2) (2,3) (3,1) (3,2) (3,3)外层i从1到3每次i变一次内层j就从1到3跑一遍。总共执行3×39次内层循环体。嵌套循环的复杂度是各层循环次数的乘积所以层数越多执行次数增长越快。三层嵌套就是立方级增长实际开发中要小心性能问题。设计嵌套循环时关键是搞清楚“外层控制什么内层控制什么”。通常外层控制行内层控制列。比如打印图形外层循环控制打印几行内层循环控制每行打印几个字符。6.2 打印小星星嵌套循环的经典入门案例打印小星星是练习嵌套循环的经典题目。需求是打印一个直角三角形* ** *** **** *****分析一共5行第1行1个星第2行2个星……第n行n个星。外层循环控制行数从1到5内层循环控制每行的星数从1到当前行号。i 1 while i 5: j 1 while j i: print(*, end) j 1 print() # 换行 i 1这里end让print不换行内层循环结束后用空的print()换行。这个模式要记牢打印任何图形都是这个套路。进阶一点打印倒三角形***** **** *** ** *外层i从5递减到1内层j从1到ii 5 while i 1: j 1 while j i: print(*, end) j 1 print() i - 1再进阶打印等腰三角形需要控制空格和星号* *** ***** ******* *********第i行有5-i个空格2*i-1个星。这个需要一点数学推导但推导出来之后代码很简单i 1 while i 5: # 打印空格 j 1 while j 5 - i: print( , end) j 1 # 打印星号 k 1 while k 2 * i - 1: print(*, end) k 1 print() i 1实操心得打印图形时先在纸上画出目标图形标出每行的空格数和星号数找出它们和行号的数学关系再写代码。直接对着屏幕想很容易乱。6.3 九九乘法表嵌套循环的综合实战九九乘法表是嵌套循环的集大成者它综合了循环、格式化输出、嵌套控制。目标输出1*11 1*22 2*24 1*33 2*36 3*39 ... 1*99 2*918 ... 9*981分析一共9行第i行有i个表达式每个表达式是j*i结果其中j从1到i。外层循环i从1到9内层循环j从1到i。i 1 while i 9: j 1 while j i: print(f{j}*{i}{j*i}, end\t) j 1 print() i 1这里用\t制表符对齐比空格整齐。f{j}*{i}{j*i}是格式化字符串把变量嵌入字符串里。注意乘法的顺序是j*i不是i*j虽然结果一样但习惯上写成j*i因为j是内层循环变量从1到i。如果想打印成上三角倒过来把外层改成i从9递减到1内层j从1到ii 9 while i 1: j 1 while j i: print(f{j}*{i}{j*i}, end\t) j 1 print() i - 1九九乘法表这个案例把循环嵌套、格式化输出、边界控制都练到了。我建议每个学Python的人都亲手敲一遍不要复制粘贴。敲的过程中你会遇到各种小问题比如对齐不对、多一行少一行解决这些问题的过程就是进步的过程。7. 常见问题与排查技巧实录7.1 循环相关的高频错误速查表问题现象可能原因排查方法解决方案程序卡死CPU占用高死循环检查循环变量是否更新确保循环体里有让条件变假的语句循环次数不对多一次或少一次边界条件写错打印循环变量观察首尾值用还是要仔细确认continue后死循环continue跳过了变量更新检查continue前是否更新了变量把更新语句放到continue之前嵌套循环结果不对内层循环变量未重置检查内层循环变量是否在每次外层循环开始时重新初始化在内层循环前重置变量打印图形格式错乱end参数或换行位置不对检查print的end和空print()内层用end外层结束后空print()累加结果不对初始值或累加项写错打印每次累加后的值累加初始值设0累乘初始值设17.2 调试循环的实用技巧调试循环最有效的方法就是打印中间变量。在循环体里加print(fi{i}, j{j})运行几次就能看出问题。如果循环次数太多可以加个计数器只打印前几次debug_count 0 while i 100: if debug_count 5: print(fi{i}) debug_count 1 # 循环逻辑 i 1另一个技巧是用小数据测试。比如九九乘法表先改成3×3测试逻辑对了再改成9×9。这样调试快输出也少。还有一个我常用的方法把循环的第一次和最后一次单独拿出来手算一遍看看和程序输出是否一致。如果不一致问题就出在边界或初始值上。7.3 从循环到更Pythonic的写法虽然这篇文章讲的是while循环但实际写Python时很多while循环可以用for循环替代代码更简洁。比如遍历列表# while写法 i 0 while i len(names): print(names[i]) i 1 # for写法 for name in names: print(name)for循环不需要手动管理索引不容易出错。再比如计数可以用enumeratefor index, name in enumerate(names): print(index, name)所以我的建议是理解while循环是基础必须掌握但实际编码时能用for就用for能用内置函数就用内置函数。while循环更适合那些“条件驱动”而非“序列驱动”的场景比如游戏主循环、等待某个状态变化。提示Python的for循环和其他语言的for不太一样它本质是迭代器循环。后面学到迭代器、生成器时会对for有更深的理解。但while循环的逻辑是通用的学好while再学for会轻松很多。7.4 循环性能的几点考量循环是性能敏感的操作。同样一个任务循环写得好不好速度可能差几倍甚至几十倍。几个经验一是尽量减少循环体内的计算能把计算移到循环外的就移出去。比如while i len(data):如果data长度不变可以在循环前算好n len(data)循环条件用i n避免每次循环都调用len。二是避免在循环里做重复的字符串拼接。Python的字符串是不可变的每次拼接都会创建新对象。如果要在循环里拼字符串先用列表收集循环结束后用join合并parts [] i 0 while i 1000: parts.append(str(i)) i 1 result .join(parts)三是嵌套循环要警惕复杂度。两层循环是O(n²)三层是O(n³)。如果数据量大要考虑用更高效的算法或数据结构。比如查找操作用字典或集合代替列表遍历能把O(n)降到O(1)。我在实际项目中遇到过一个问题一个数据处理脚本用两层嵌套循环处理几万条数据跑了十几分钟。后来把内层循环的列表查找改成字典查找时间降到几秒钟。这个经历让我深刻体会到循环写法的优化空间很大。8. 循环学习的进阶路线与练习建议学完while循环的基础知识下一步该练什么我的建议是分三个阶段。第一阶段把本文的代码全部手敲一遍包括小星星和九九乘法表确保能独立写出来。第二阶段找一些练习题比如求素数、斐波那契数列、水仙花数这些都需要循环配合条件判断。第三阶段尝试用循环解决实际问题比如读取文件统计词频、处理表格数据、写一个简单的命令行菜单程序。练习的时候不要只看不写。编程是手艺活看会了不等于写会了。我见过太多人看教程觉得懂了一上手就卡壳。哪怕是最简单的打印1到10也要亲手敲一遍感受一下循环变量的变化。另外学会用print调试是基本功。不要觉得打印调试low真正工作中打印调试是最快最直接的方法。等你熟练了再用调试器也不迟。最后分享一个我自己的习惯每学完一个知识点我会用自己的话把它写下来就像这篇笔记一样。写的过程会逼着你把逻辑理清楚很多模糊的地方一写就暴露了。这个方法对我帮助很大推荐你也试试。循环这块只要你把while的逻辑吃透了后面的for、列表推导式、生成器都会顺理成章。基础打牢后面才跑得快。

关于本文作者

来自尧图内容编辑团队

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

尧图内容编辑团队

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

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

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

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

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

网站改版的5个关键决策

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

获取专属建站方案

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

立即免费咨询