
1. 这次测验到底想考什么1.1 为什么第二次测验就考条件判断和循环“Python 测验2条件判断与循环”光是这个标题就把 Python 入门阶段最要命的一道坎给划出来了。我带过的训练营里第一次测验基本都在考变量、数据类型、字符串操作这些“认单词”的活儿。到了第二次测验我通常会把条件判断和循环放到同一张试卷里因为这俩从来不是两个孤立的知识点它们是程序能够“活”起来的起点。你可以这样理解写程序其实就是给计算机下指令但计算机本身没有任何判断能力你不告诉它“什么情况下做什么事”它就只会老老实实从上往下走。条件判断给程序安上了眼睛循环给程序装上了发动机——一个负责看路一个负责跑路缺少任何一个你写出来的代码都只是一堆不能应变、不能重复的静态指令。那为什么要把它们放在“测验2”这个位置来考因为这是初学者从“能看懂代码”到“能写出来解决问题”的分水岭。测验1你还能靠背语法蒙混过关到了测验2题目稍微绕一点分支套循环、循环里套分支没有建立起完整的逻辑框架代码跑出来的结果就会完全不是那么回事。1.2 这份测验的受众与考察方向在复盘这份测验之前先明确受众刚学完 Python 基础语法的初学者想检验自己对条件判断和循环的掌握程度正在准备 Python 相关考试或面试的人需要通过典型题目巩固控制流知识自学 Python 但缺乏练习反馈的人可以拿这份测验当自测题做完对比参考实现。接下来谈谈考察方向。我设计这份测验时牢牢锁定了四个核心能力分支逻辑的完整性能不能把 if/elif/else 的边界条件想全而不是只写一个 if 就完事循环结构的熟练度for 循环和 while 循环分别该用在什么场景能不能正确设定循环范围和退出条件条件与循环的组合能力测验里的综合题必须同时用到条件判断和循环才能解出来单靠背语法是做不出来的代码排错能力缩进、类型转换、边界值这些细节看起来不起眼但恰恰是初学者最容易翻车的地方。说到底这份测验不追求偏题怪题每一道题都是日常开发中反复出现的基础场景。能把这几道题吃透你就等于给后续的函数、列表推导式、字典操作甚至算法打好了地基。2. 测验题目结构与知识点拆解2.1 全部题目的整体设计这份“测验2”一共安排了五道编程题题量适中难度从低到高呈阶梯式分布。我用一张表把整体结构先列出来题号题目类型核心考察点难度题目1奇偶数判断条件分支、输入类型转换简单题目2成绩等级评定if/elif/else 完整分支简单偏中题目3水仙花数查找for 循环、取位运算中等题目4猜数字游戏while 循环、random 模块、逻辑控制中等偏难题目5九九乘法表嵌套循环、输出格式化中等偏难题目6质数判断循环控制、break/else 组合进阶为什么用这六道题原因很简单它们几乎覆盖了条件判断和循环在入门阶段的所有高频场景。题目1和题目2纯粹考察分支结构题目3和题目4把循环作为主角题目5专门练嵌套循环的套路题目6则用来考察 break/else 这组容易被忽略的组合用法。六道题彼此独立但内在逻辑是层层递进的。2.2 每道题的思维路径拆解先说题目1奇偶数判断。这道题的代码量非常小核心代码可能三五行就写完了但它考验的是对input()返回类型的敏感度。很多新手第一次写这道题拿input()的结果直接和数字比较程序怎么跑都是错的这就是没有意识到input()在 Python 3 里返回的一定是字符串。从这道题就能看出一个人的基本功扎不扎实。题目2是成绩等级评定常见的场景是“90分以上为优秀80到90为良好60到80为合格60以下为不合格”。这道题看起来只是在写 if/elif/else但真正写得漂亮的人不多。问题出在两个方面一是分支顺序如果不设计好后面的条件判断就会变得冗长二是边界值经常被忽略比如 80 分到底算“良好”还是算“优秀”如果题目描述不清晰写出来的代码必然有歧义。题目3的水仙花数是一个经典题目所谓水仙花数是指一个三位数它的每个位上的数字的立方和等于它本身。例如 153 就是水仙花数因为 1³ 5³ 3³ 153。这道题的关键不在循环本身而在于怎么从一个三位数中取出百位、十位、个位。我见过太多人在这里纠结用字符串切片、用取整和取余、用列表推导式……其实最稳妥、最经典的解法就是//和%的组合运算。题目4的猜数字游戏很多人会把它当玩具但它其实是练习 while 循环最好的载体。程序随机生成一个 1 到 100 之间的整数用户输入猜测程序给出“大了”“小了”或“恭喜”的提示直到用户猜中为止。这里有一个初学阶段容易踩的坑程序怎么判断用户是否猜中什么时候退出循环如果用户一直猜不中循环是不是永远跑下去这里需要引入一个“标志变量”或者直接用 break 语句来跳出循环。题目5的九九乘法表我第一次让学员做这道题的时候班里一片哀嚎。倒不是说嵌套循环有多难理解难的是输出格式怎么控制。如果直接print()输出默认情况下每个输出后面都会跟一个换行符结果就是每一行只有一个算式完全达不到九九乘法表的效果。这里要用到print()函数里的end参数来控制不换行还要考虑乘法表中的对齐问题。题目6的质数判断进阶题但非常值得一做。质数的定义是只能被 1 和它本身整除的自然数。判断一个数是不是质数最简单的思路当然是从 2 一直试除到 n-1只要有任何一个数能整除就不是质数。这个思路用 for 循环写出来并不难但怎么让代码提前退出循环、怎么判断循环是不是正常跑完就需要用到 for...else 这种结构了。很多初学者压根不知道 Python 的 for 循环还能配 else这题就是在考这个知识点。3. 参考答案与关键知识点解析3.1 题目1和题目2条件分支的完整写法题目1的参考代码如下num int(input(请输入一个整数)) if num % 2 0: print(f{num} 是偶数) else: print(f{num} 是奇数)这段代码简洁干净但请注意两个细节。第一input()结果必须用int()转成整数否则%运算会直接报错。第二判断条件写成num % 2 0而不是num % 2 ! 1前者更符合大多数人的思维习惯。另外有些中文教程喜欢把“偶数”放在 else 分支里这也是可以的但如果要严格判分我更希望看到完整的两分支结构。题目2的参考代码如下score int(input(请输入分数)) if score 90: grade 优秀 elif score 80: grade 良好 elif score 60: grade 合格 else: grade 不合格 print(f等级{grade})为什么这样写而不是score 60 and score 80这种写法因为 Python 的 if/elif/else 是从上往下逐条判断的一旦某个条件满足后面的就不再执行。所以只要保证了第一个条件是score 90第二个条件只需要写score 80就自动隐含了“小于90”这个前提。这种写法代码量更少也不容易出错。真正要注意的是边界90 分算不算优秀如果题目要求“90 分以上”那就要用score 90差一个等号结果就完全不同。这里有一个很多教程不会细讲的点分支条件的顺序是会影响逻辑结果的。我见过有人把score 60写在score 80前面结果 85 分被判定为“合格”这就是条件顺序不敏感导致的 bug。所以在写的时候脑子里一定要有一条从上到下的“条件递减链”。3.2 题目3和题目4for 循环与 while 循环的典型实现题目3的水仙花数参考代码如下for num in range(100, 1000): hundreds num // 100 tens (num // 10) % 10 units num % 10 if hundreds ** 3 tens ** 3 units ** 3 num: print(num)这里最值得讲的就是//和%的配合num // 100取出百位。例如 153 // 100 1(num // 10) % 10取出十位。例如 153 // 10 1515 % 10 5num % 10直接取出个位。例如 153 % 10 3。我见过有同学直接暴力用字符串切片把str(num)[0]当成百位程序当然也能跑通。但如果你打算继续深入学习算法就必须掌握用数学运算取位的思路因为字符串转换的性能远不如数学运算而且在很多编程语言里这种取位方式才是通用的。题目4的猜数字游戏参考代码如下import random target random.randint(1, 100) while True: guess int(input(请猜一个 1 到 100 之间的数字)) if guess target: print(猜大了再试试) elif guess target: print(猜小了再试试) else: print(恭喜你猜对了) break这道题的核心是while True加break的组合。有些初学者学完 while 循环之后总觉得循环条件一定要是一个能计算成 True 或 False 的表达式看到while True就直接懵了。其实while True是 Python 中常见的一种循环写法配合循环体内部的break语句可以在满足特定条件时主动退出循环。这种模式在处理“用户输入次数未知”的场景时特别有用比用计数器控制的写法要简洁得多。特别提醒使用while True的时候一定要确保循环体内部存在break或者能达到break的条件否则就会陷入无限循环程序直接卡死。在写这道题的时候还有同学把random.randint写成了random.random导致生成的随机数不是整数类型完全不匹配。这里要注意random.randint(1, 100)是闭区间包含 1 和 100而random.random()生成的是 0 到 1 之间的小数用法完全不同。3.3 题目5和题目6嵌套循环与循环的高级控制题目5的九九乘法表参考代码如下for i in range(1, 10): for j in range(1, i 1): print(f{j} * {i} {i * j}, end\t) print()这道题的嵌套循环逻辑其实不复杂外层循环控制行数内层循环控制每一行有多少个算式。关键在于end\t和最后的空print()。print()默认会在末尾加一个换行符end\t把这默认行为改成了制表符所以同一行的算式之间用 Tab 分隔当内层循环跑完之后一个空print()负责换行下一行就从头开始了。在批改中我发现一个很有趣的现象有学员把内层循环的范围写成了range(1, 10)结果每一行都输出完整的 9 个算式整个乘法表从三角形变成了正方形。这就是没有理解range(1, i 1)的核心逻辑——内层循环的范围依赖于外层循环的当前值。这种“外层控制行、内层控制列”的思路是嵌套循环最基础的套路值得反复练习。题目6的质数判断参考代码如下num int(input(请输入一个大于1的整数)) for i in range(2, num): if num % i 0: print(f{num} 不是质数) break else: print(f{num} 是质数)为什么要用 for...else 而不是定义一个标志变量因为 Python 的 for...else 结构非常巧妙当循环正常执行完毕没有被 break 提前终止时else 分支就会被执行一旦循环被 break 中断else 分支就不会执行。这个特性简直是为质数判断量身定做的——如果能被某个数整除说明是合数break 跳出如果整个循环都没有被整除说明是质数走 else 分支。很多教材不强调 for...else但它实际上是个很实用的知识点。写这个分支时还藏着一个很小的优化点其实只需要检查到int(num ** 0.5)就够了因为如果一个数有因子那它一定有一个因子不大于它的平方根。不过对于入门测验从 2 遍历到 num-1 也能接受重点是把逻辑跑通优化可以放到后面再谈。4. 批改中看到的常见问题与排查技巧4.1 出错频率最高的五个典型错误每次批改完这份测验总能在作业里看到一些高度重复的错误。我把它们整理成了下面的速查表你们可以直接对照着检查自己的代码常见错误典型表现正确思路赋值与比较混淆写if num 5:条件判断要用赋值用忘记类型转换input()的结果直接与整数比较先int()再比较缩进不当if/elif/else 代码块未对齐Python 以缩进划分代码块无限循环while 条件永远为 True循环体内无退出机制设置计数器或用 break边界值错误range(1, n)误以为包含 nrange 是左闭右开区间第一个错误出现的频率最高很多初学者刚学完“变量赋值”转头就在条件判断里犯迷糊。和在 Python 里是两个完全不同的运算符前者是赋值后者是比较。写代码的时候如果看到程序报错“invalid syntax”百分之八十是在这个位置出了问题。第二个错误几乎每期测验都会出现。input()函数返回的永远是字符串不管用户输入的是数字还是别的什么。如果你拿字符串和整数做大小比较Python 会直接报 TypeError或者在某些场景下产生让人摸不着头脑的逻辑错误。正确做法是要么在接收输入时转换要么在使用时转换。第三个错误是 Python 独有的“坑”。其他语言用花括号或 end 来界定代码块Python 只用缩进。缩进不一致会直接导致 IndentationError。而且缩进层级也代表了逻辑层级如果 if 后面的代码没有正确缩进程序可能不会按你想的那样运行。第四个错误无限循环在猜数字和质数判断这两道题里特别常见症状就是程序跑起来之后终端窗口刷个没完你想停都停不下来。这时候只能CtrlC强制中断。排查思路就是检查循环条件count 变量有没有更新退出条件是否会在某个时刻满足有没有可能因为输入问题导致循环永远无法退出第五个错误是边界值问题。range(1, 10)生成的是 1 到 9 的整数不包括 10。很多新手写循环累加时希望从 1 加到 100却把range的上限定成了 100结果求和结果少了一个 100。这个细节极其容易忽略又极其致命。4.2 定位 bug 的四步排查流程我自己在批改学员代码时总结了一套定位问题的高效流程分享给你们第一步先看报错信息。Python 的报错其实非常友好它会告诉你错误类型和出错行号。关键要看是在哪一行出的错报的是 NameError、TypeError 还是 IndentationError。很多人看到密密麻麻的红色报错就慌了其实只要盯住最后一行“NameError: name xxx is not defined”之类的提示问题往往立现。第二步打印中间变量。如果程序能跑完但结果不对就在可疑位置加上print()把关键的变量值打出来看看。比如九九乘法表跑出来不对就先打印外层循环的 i 和内层循环的 j 分别是什么值一对比就能发现循环范围的问题。排查完记得删掉这些调试用 print。第三步小数据测试。当年我调试条件判断和循环时最常用的方法就是拿极小的数据去试。比如水仙花数那题别一上来就跑 100 到 999 的全部范围先手动测试num 153看看取出来的百位、十位、个位是不是 1、5、3。数据越小越容易用肉眼看出问题在哪。第四步边界值测试。就是把输入设计在条件的临界位置。比如成绩等级评定的题测一下 90、89、80、79、60、59 这几个分数确保每一档的边界都符合要求。这一步能做到位说明你对自己写的代码很有把握。这套流程别看简单它其实是所有程序员每天在做的“调试循环”。遇到问题不要慌按步骤来基本都能找到问题所在。4.3 几个容易忽视的细节习惯除了上面的大错误我还想提几个日常写代码容易忽视的小习惯这些习惯看似不起眼但对代码质量影响很大第一变量命名要有意义。我见过有人用a、b、c这种单字母变量名写九九乘法表代码可读性极差。多用hundreds、tens、units这种能看懂含义的名字三个月后回来看代码你会感谢自己当初的用心。第二判断条件尽量正向思考。比如判断奇偶可以直接用num % 2 0表示偶数条件反而比某些绕弯子的写法更直观。判断成绩等级时也要让条件“顺着读”就符合直觉不要绕来绕去。第三测试时要特别关注边界。写条件判断时边界值是最容易出错的。写完之后养成一个随手测边界条件的习惯比如分数 90、60数字 100、0、负数确认程序的行为符合你的预期。这种习惯在将来写更复杂的程序时能帮你节省大量排错时间。5. 从测验题到实战这套能力的真正用武之地5.1 条件判断与循环在日常开发中的典型场景做完这份测验很多学员都会有一个疑问这些题目看起来挺简单的将来真的用得上吗实际上条件判断与循环是所有程序逻辑的骨架几乎所有稍具实用价值的代码都离不开它们。这里我列举几个典型的实战场景场景一用户输入校验。无论你写什么样的程序只要涉及用户输入就必须用条件判断去校验输入的合法性。比如用户输入的年龄是不是数字、是不是在合理范围内、是不是为空这些全部需要if配合循环来反复询问直到得到合法输入为止。猜数字游戏其实就是这个场景的简化版本。场景二批量数据处理。日常工作里最常做的就是遍历一批数据逐个做判断和加工。例如读取一个 CSV 文件里面有几千行销售记录你需要把所有金额大于 1000 的记录提取出来这本质就是 for 循环加 if 判断。将来你学习列表推导式、字典推导式时会发现它们的核心逻辑依然是条件和循环只是换了一种更简洁的写法。场景三算法实现。二分查找、冒泡排序、素数筛每一个经典算法的基础都是条件判断和循环。你现在写的水仙花数、质数判断就是在为将来更复杂的算法做思维训练。我见过不少学员学算法时一脸痛苦回头分析才发现是因为当初条件判断和循环的基本功不扎实连最基础的逻辑链条都搭不起来。场景四数据可视化与自动化脚本。很多人学 Python 是为了做数据分析或网页爬虫这些方向同样离不开循环和判断。爬虫中的翻页循环数据处理中的条件过滤一个个脚本写下来你会发现绝大多数代码行都跑不出“判断 循环”这两个范畴。5.2 更高阶的延伸列表推导式与嵌套应用当你把条件判断和循环练得足够熟练之后可以开始接触 Python 里更高级的写法最典型的就是列表推导式。举个例子想要生成 1 到 100 之间所有偶数的平方用普通写法是这样result [] for i in range(1, 101): if i % 2 0: result.append(i ** 2)而用列表推导式一行就搞定了result [i ** 2 for i in range(1, 101) if i % 2 0]看起来是不是非常简洁但前提是你必须完全理解 for 循环和 if 条件判断要不然这一行代码对你来说就是天书。列表推导式不是凭空冒出来的语法糖它只是把你已经掌握的循环和判断写进了方括号里。反过来讲如果在测验2这个阶段就练稳了条件判断和循环后面学列表推导式、字典推导式、生成器表达式都会轻松很多。我自己当年的学习路线也是这样先把 if 和 for 写得滚瓜烂熟再去追求简洁写法一切水到渠成。5.3 给初次接触这份测验的同学几个具体建议最后结合我批改多期作业的经验给初次接触这份测验的同学三条切实可行的建议建议一先自己动手写再对照参考答案。这份测验的代码我虽然给了参考实现但如果你一开始就抄答案那这份测验的价值就大打折扣了。拿到题目先自己想思路哪怕写得再丑、再笨拙只要能跑通你就是真的掌握了。写完后再对照参考答案看看别人的思路和你的有什么不同这种差异才是学习中最有意思的部分。建议二练习时不要跳过任何一道题。我知道有人会觉得题目5九九乘法表太基础、题目4猜数字太玩具直接跳过去做所谓“更难”的题目。这种想法要不得。每一道测验题都对应一种特定的编程模式题目4练的是 while 循环与 break 的配合题目5练的是嵌套循环和输出控制这些模式在实战中都是高频出现的现在练扎实了后面遇到同类型问题才能手到擒来。建议三给每道题至少写两种解法。这是一个我至今仍在使用的学习方法。以水仙花数为例你首先用%和//写出第一版然后用字符串操作写出第二版再想想能不能基于列表推导式写出第三版。三种写法都能跑通之后你对这个知识点的理解深度就完全不一样了。条件判断和循环的能力不是看会的是练会的。最后分享一点个人体会这份测验2我用了很多期每次批改都能发现新的问题。反复迭代下来我更加确信一件事条件判断与循环并不难难的是建立“程序是这样一步步执行”的思维模型。很多学员写错代码不是不知道 if 怎么写、for 怎么用而是脑子里根本没有形成“控制流”的概念——不知道程序会按什么顺序走、会在哪里分支、会在哪里循环、会在哪里退出。如果你正在学 Python我真心建议把这份测验从头到尾自己动手做一遍不要只停留在“看懂了”的层面。每道题都亲自在编辑器里敲一遍、跑一遍、改一遍把你踩过的坑记录下来。条件判断与循环的功夫扎实了后面学任何高级特性都会觉得轻松许多。我希望这份测验复盘能帮你在 Python 这条路上少走一些弯路。