零基础学 Python 第 5 章 | while 循环与循环嵌套:让程序看着条件自己干活
本章摘要核心目标学会用while循环让程序看着条件干活直到条件不成立才停下核心知识点while语法 / 条件驱动循环 / 死循环while True/break与continue在while中的用法 / 循环嵌套实操产出能独立写出猜数字游戏、密码输入验证、菜单式交互小程序前置基础第 3 章if/elif/else第 4 章for循环、range()、break/continue写在前面第 4 章的for循环解决了重复 N 次的问题——次数已知比如打印 100 个数字、遍历 8 个学生。但生活里更多的情况是——次数不确定只有一个停下来的条件用户输错密码让他再试直到猜对或者失败 3 次锁定玩猜数字游戏让他一直猜直到猜中为止处理排队用户一直处理直到队伍空了这些场景for循环处理起来很别扭但用while循环一句话就能表达“只要条件成立就一直做”。这一章你会认识 Python 循环家族的第二个大将while以及循环里套循环这个进阶用法。学完你会开始感觉——程序真的在替你思考了。一、while循环条件驱动的重复1.1 最简单的while循环count1whilecount5:print(第,count,次)countcount1运行输出第 1 次 第 2 次 第 3 次 第 4 次 第 5 次拆开来读一遍循环前count 1初始化一个计数器检查条件count 5是不是True执行循环体打印当前count然后count加 1回到第 2 步继续检查条件直到条件变成False循环结束1.2while的语法结构while条件表达式:循环体代码三个雷打不动的要点条件末尾冒号:——漏了报语法错循环体缩进——4 个空格VS Code 自动帮你缩循环体里必须有能让条件变False的代码——否则就是死循环程序永远停不下来⚠️新手最大的坑忘记写count count 1导致count永远是 1条件永远成立程序卡在那里一直打印。这时候按Ctrl C强制中断。1.3while什么时候用for什么时候用一张表说清楚场景用哪个关键判断打印 1 到 100for次数已知遍历一个列表for次数 列表长度已知用户输错密码就一直重新输while次数不知道看用户猜数字直到猜对while次数不知道看运气服务器一直处理请求while True永远运行从文件里读一行处理一行while不知道有多少行一句口诀次数已知用for条件驱动用while。二、while True故意的死循环2.1 什么是死循环前面说循环体必须有能让条件变False的代码——这是大部分场景的要求。但有时候我们故意写死循环然后在内部用break精确控制退出时机whileTrue:textinput(输入内容输入 q 退出)iftextq:print(再见~)breakprint(你输入了,text)运行示例输入内容输入 q 退出hello 你输入了 hello 输入内容输入 q 退出python 你输入了 python 输入内容输入 q 退出q 再见~while True:表示条件永远成立——理论上永远循环。但我们在里面用if break让程序在用户想退出的时候才退出。2.2while True的典型用法交互式菜单程序——一直等用户输入直到用户选退出游戏主循环——一直运行直到玩家结束游戏服务器程序——一直监听请求直到管理员手动停止这些场景的共同点是——退出时机在循环体内部才能判断出来写不成while 条件:的形式。2.3break和continue在while里同样管用# 让用户输入 5 个数字遇到负数直接终止count0whilecount5:numint(input(请输入一个数字))ifnum0:print(检测到负数程序终止)breakifnum0:print(0 跳过不计)continueprint(有效数字,num)countcount1print(总共录入了,count,个有效数字)break— 遇到负数直接终止整个whilecontinue— 遇到 0跳过本次回到while顶部重新判断只有非零非负的数字才会让count加 1三、循环嵌套循环里套循环3.1 什么是循环嵌套循环嵌套就是在一个循环的循环体里再写另一个循环。外层循环转一次内层循环转一整轮。先看最经典的例子——九九乘法表foriinrange(1,10):forjinrange(1,i1):print(str(i)*str(j)str(i*j),end )print()# 换行输出1*11 2*12 2*24 3*13 3*26 3*39 4*14 4*28 4*312 4*416 5*15 5*210 5*315 5*420 5*525 6*16 6*212 6*318 6*424 6*530 6*636 7*17 7*214 7*321 7*428 7*535 7*642 7*749 8*18 8*216 8*324 8*432 8*540 8*648 8*756 8*864 9*19 9*218 9*327 9*436 9*545 9*654 9*763 9*872 9*981拆开理解外层for i in range(1, 10)i从 1 走到 9控制行内层for j in range(1, i 1)j从 1 走到i控制列内层每次不换行end 跑完一整行后外层的print()单独换行总共执行了多少次内层循环1 2 3 … 9 45 次。3.2for套while、while套while都行嵌套的两个循环不一定同类型怎么方便怎么用。例让用户输入 3 组数据每组数据一直输入直到输入 -1 才结束forgroupinrange(1,4):print( 第,group,组 )whileTrue:numint(input(输入数字-1 结束本组))ifnum-1:breakprint(已记录,num)print(三组数据录入完毕)外层for控制3 组这个已知次数内层while Truebreak控制每组不知道输多少个for管次数while管条件——各司其职。3.3 嵌套循环的性能提示外层跑 100 次内层跑 100 次加起来是10000 次。如果外层 1000 次、内层 1000 次就是100 万次——机器还能扛住。但外层 10000、内层 10000 就是1 亿次普通电脑可能卡住。 零基础阶段不用担心性能——你能碰到的循环基本都在千次以内。等真正写到大数据处理我们会介绍更高效的方式比如numpy向量化、生成器等。四、Scratch 积木对照Scratch 里的「重复执行直到 XX」积木就是 Python 的while循环。ScratchPython说明「重复执行直到 [条件]」while not 条件:条件不满足就一直做「永远执行」while True:死循环「重复执行 N 次里嵌套重复」for 里嵌 for循环嵌套# Scratch「重复执行直到 分数 100」→ Python 对照score0whilescore100:scorescore10print(当前分数,score)Scratch 的重复执行直到和 Python 的while判断条件方向相反——Scratch 是到什么时候停Python 是什么时候还继续。语义相反逻辑相同。五、综合实战案例猜数字小游戏5.1 需求描述经典的编程入门游戏程序在 1-100 之间随机生成一个数字用户不断猜测程序提示猜大了或猜小了猜对时提示恭喜并显示总共猜了多少次支持作弊命令输入q直接放弃程序公布答案5.2 完整源码# 猜数字小游戏 importrandom# 随机生成一个 1-100 的目标数answerrandom.randint(1,100)count0print(*30)print( 猜数字游戏1-100)print( 输入 q 直接放弃)print(*30)whileTrue:user_inputinput(请输入你猜的数字)# 允许放弃ifuser_inputq:print(你放弃了正确答案是,answer)break# 输入合法性检查ifnotuser_input.isdigit():print(请输入 1-100 的整数或输入 q 放弃)continueguessint(user_input)countcount1ifguess1orguess100:print(超出 1-100 范围重新猜)countcount-1# 无效尝试不计次数continueifguessanswer:print(猜小了 ↑)elifguessanswer:print(猜大了 ↓)else:print(*30)print( 恭喜猜对了答案就是,answer)print(你一共猜了,count,次)print(*30)break5.3 运行示例 猜数字游戏1-100 输入 q 直接放弃 请输入你猜的数字50 猜小了 ↑ 请输入你猜的数字75 猜大了 ↓ 请输入你猜的数字60 猜小了 ↑ 请输入你猜的数字68 猜小了 ↑ 请输入你猜的数字72 猜大了 ↓ 请输入你猜的数字70 恭喜猜对了答案就是 70 你一共猜了 6 次 5.4 分步拆解第 1 步import random生成随机数importrandom answerrandom.randint(1,100)random是 Python 内置的随机数模块——不需要 pip 安装import一下就能用。random.randint(a, b)生成a 到 b 之间包含两端的随机整数。random.randint(1, 100)是闭区间[1, 100]和range(1, 100)的左闭右开[1, 100) 不一样。别混淆。第 14 章模块与库会详细讲import机制。第 2 步while Truebreak控制循环猜数字的次数完全不确定——运气好 1 次猜中运气差可能 10 次。这是典型的while True场景。猜对了就break用户主动放弃也break。第 3 步非法输入用continue跳过ifnotuser_input.isdigit():print(请输入 1-100 的整数或输入 q 放弃)continueisdigit()判断字符串是不是纯数字组成返回 True/False非数字直接continue——跳过本轮让用户重新输入不计入次数第 4 步范围超界不计次数ifguess1orguess100:print(超出 1-100 范围重新猜)countcount-1# 抵消上面的 count 1continue这一步演示了一个小技巧——先加了 1发现无效再减回来。也可以先判断范围再加 1逻辑等价。第 5 步三分支判断结果ifguessanswer:print(猜小了 ↑)elifguessanswer:print(猜大了 ↓)else:...break标准的if / elif / else——第 3 章知识点直接复用。第 6 步猜对后break退出循环else分支里print恭喜信息 break结束整个while。缩进要和if guess answer:对齐——都是while循环体的直接子级。六、常见报错速查表报错信息场景原因解决方法程序卡住不动无输出while循环死循环——循环体里没有让条件变False的代码按Ctrl C中断检查循环体是否有计数器更新SyntaxError: expected :写while循环条件末尾漏了英文冒号在条件表达式后加:IndentationError: expected an indented blockwhile下一行循环体没缩进循环体缩进 4 个空格NameError: name count is not defined循环里用count循环外没初始化count循环前先写count 0ValueError: invalid literal for int() with base 10: abcint(user_input)用户输入了非数字字符串先用isdigit()判断再转换AttributeError: int object has no attribute isdigitint变量调用isdigit()isdigit()只能用在字符串上不能用在整数上在int()转换之前判断七、本章小结这一章你解锁了 Python 循环家族的第二个大将以及循环嵌套这个进阶用法✅while 条件:— 条件驱动的循环✅while True break— 主动控制退出时机的死循环✅ 什么时候用while、什么时候用for次数 vs 条件✅break/continue在while里的用法完全一致✅ 循环嵌套 — 外层管次数内层管细节✅ 猜数字游戏 — 综合运用while/if/input/random有了forwhile 嵌套Python 里 90% 的重复干活场景你都能写出来。接下来我们要把注意力从怎么重复转向数据本身怎么组织——列表、元组、集合、字典这些容器登场。往期回顾《Python 零基础入门从积木到代码》专栏序零基础学 Python 第1章 | 全平台装环境 VS Code 配置 第一个 Hello World零基础学 Python 第2章 | print 输出 变量赋值 input 交互输入零基础学 Python 第3章 | 条件判断if / elif / else零基础学 Python 第 4 章 | for 循环与 range()让程序帮你重复干活下一章第 6 章会讲第 6 章 | 元组与集合不可变数据与自动去重除了列表Python 还有两种常用容器——元组一旦创建不能改和集合自动去重。这两个容器在实际开发里非常常见学会它们你才算真正入门了数据结构。从操作循环到操作数据你的 Python 视野会再打开一层。文末资源区资源说明Python 官方文档 ·while语句https://docs.python.org/zh-cn/3/reference/compound_stmts.html#the-while-statementPython 官方文档 ·random模块https://docs.python.org/zh-cn/3/library/random.html本章配套源码 · chapter5_all.py关注梅雅达编程笔记评论领资料每节课都配套课后练习题与完整源码。代码报错、看不懂知识点可在评论区粘贴问题逐一解答欢迎关注梅雅达编程笔记持续分享Python零基础学习内容
