尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Python条件判断与循环:从if到while的避坑与练习

Python条件判断与循环:从if到while的避坑与练习 Python 基础学到条件判断和循环基本就到了第一个分水岭。之前写变量、做运算一行一行都是线性思维从if开始程序才真正学会转弯从for、while开始程序才学会重复干活。《Python 测验2条件判断与循环》就是专门卡在这个分水岭上的一套题题目设计不算难但每一道都藏着初学者最容易踩的坑也覆盖了条件判断与循环里最重要的几个使用场景。适合刚学完 Python 语法、准备做进阶练习的朋友也适合作为教学机构或自学者的一道阶段性检测。不夸张地说能把这套题做到全对的人后面学函数、学列表、学文件读写都会顺畅很多。1. 这份测验为什么只考条件判断和循环1.1 条件判断和循环是所有程序逻辑的骨架我经常跟学生打一个比方条件判断是程序里的岔路口循环是程序里的传送带。没有岔路口程序就只能一路直行没有传送带程序就只能把同一句话机械地复制一百遍。真实项目里几乎找不到不用条件判断和循环的程序哪怕你只是写一个自动下载图片的脚本也得靠if判断文件存不存在、靠for遍历几百个链接。所以学 Python 的第一个关键坎就是这两块。我在设计这份测验的时候刻意把难度控制在基础以上、进阶未满的区间。题目里没有偏题怪题但也不是简单地让你背语法而是要求你真的去理解执行过程。举个例子很多初学者能背出range(5)生成 0 到 4但真让他手写下一次循环的每一步变化反而写不利索。这套题就是冲着这种好像会了其实不会的状态去的。1.2 从测验1到测验2的递进设计严格来说这不是我出的第一套题。前面还有一份围绕变量、数据类型、输入输出和运算符的测验1主要解决的是能不能写出能跑的代码的问题。到了这份测验2关注点就从代码能不能跑变成了代码跑得对不对、你知不知道它为什么这么跑。因此这套题在结构上做了三层递进第一层是读代码写输出考察对if和循环执行流程的理解第二层是改代码补条件考察对边界条件和逻辑组合的敏感度第三层是白纸写代码考察能不能把思路转化为完整 Python 代码。我批改作业的时候发现很多同学在第三层暴露的问题最明显——读代码时头头是道一动手就各种漏缩进、漏冒号、忘记更新循环变量。1.3 怎么使用这份测验最高效如果你是自己学习建议先别看后面的答案解析老老实实拿出一张纸把每道题的输出或代码先写下来再去电脑上跑一遍验证。如果你是要用它来带学生或者自测建议把时间控制在 40 分钟到 1 小时读代码题和写代码题分开计时。写代码题千万不要只在脑子里想一定要真的在编辑器里敲一遍。我见过太多眼睛会了、手不会的例子Python 这种语言动手跑一次比看十遍解析都管用。还没装好 Python 环境的话建议先花十分钟把 VSCode 的 Python 环境配好装好插件不然看再多的 Python 教程都是纸上谈兵。2. 做题之前先把这几个关键知识点盘一遍2.1 if / elif / else 的执行顺序条件判断最核心的一点是if...elif...else是一整个整体程序会从上往下依次判断条件一旦遇到某个条件成立执行完对应的代码块后后面的 elif 和 else 都不会再看了。这一点看着简单实际操作中特别容易出问题。我之前在批改里见过一个很典型的错误写法有人想判断成绩等级写了三个并排的ifscore 85 if score 60: print(及格) if score 80: print(良好) if score 90: print(优秀)这段代码跑出来会同时打印及格和良好因为三个if是独立的每个都会进行一次判断。而正确做法是用elif让它们互斥。这就是为什么我在测验里专门设计了一道成绩等级题目的就是考这个互斥逻辑有没有掌握。2.2 比较运算符、逻辑运算符和真假值条件判断离不开比较和逻辑运算。、!、、、、这些是基础难点在and、or、not的组合使用。学逻辑运算符的时候我建议你背一个表表达式结果注意点True and FalseFalseand 两边必须都真True or FalseTrueor 只要一边真即可not TrueFalse取反另外 Python 有一个别家语言不太一样的特性在条件判断里非布尔值也会被当作真假值处理。0、空字符串、空列表[]、None都会被当成假其他值基本都是真。比如x 0 if x: print(条件为真) else: print(条件为假)这里输出的是条件为假因为0在布尔环境里是假的。这个特性在实战里经常用到比如判断一个列表是否为空直接写if my_list:就行了没必要写if len(my_list) ! 0:。2.3 range() 的三种形态range()是 Python 循环题里的常客但它的三种形态经常把新手绕晕range(5) # 从 0 开始到 4 结束步长默认 1 range(1, 5) # 从 1 开始到 4 结束 range(1, 10, 2) # 从 1 开始到 9 结束每次加 2记住一句话range 是左闭右开区间。也就是起始值包含在内结束值永远不包含。所以range(1, 100)实际上是 1 到 99如果题目要求求 1 加到 100你要写range(1, 101)。这个边界问题在测验里几乎每次都会有人错第 4 节我再详细讲。2.4 while 循环和 break / continue 的作用for循环适合知道要循环多少次的场景比如遍历一个列表或一个固定范围while循环适合不知道要循环多少次只知道什么时候该停的场景比如不断读取用户输入直到输入特定字符为止。while最核心的注意点就是循环条件一定要在循环体里发生变化否则就成了永不结束的死循环。举个例子n 1 while n 10: print(n)这段代码会一直打印 1因为n从头到尾没有变。我的学生里有相当一部分人的第一份代码就卡在这个问题上。正确的写法必须在循环体里加上n 1来更新变量。break的作用是立刻跳出当前整个循环continue的作用是跳过本次循环的剩余部分、直接进入下一次循环。这两个词我建议你通过实际的小题目来体会差异别死记概念。3. 测验题目与逐题解析下面就是完整版题目。建议你先自己写答案再对照解析看。3.1 第一组条件判断基础题目1读代码写出输出结果。x 7 if x % 2 0: print(偶数) else: print(奇数)答案奇数。这道题很简单考察的是取余运算%和条件分支的配合。7 % 2的结果是 1所以条件1 0不成立走else分支。新手常见的错误是把写成这样在 Python 里会直接报语法错误。另外判断奇偶数用x % 2是最朴素的思路等学了位运算还可以写x 1但现阶段没必要追求花哨。题目2读代码写出输出结果。score 75 if score 90: print(A) elif score 80: print(B) elif score 70: print(C) elif score 60: print(D) else: print(F)答案C。这道题考的是elif的执行顺序。75不满足90也不满足80但满足70因此打印 C。注意这里的坑是如果把条件从低到高排比如先判断60就会出问题因为 75 分也会被判定为 D。所以写分数段的时候条件顺序必须从高到低或者用and把区间限定住比如score 70 and score 80。我在批改中看到不少人死记了分数段要从高到低的结论但不知道为什么一旦题目改成月份或年龄段判断又跳回老毛病。原理其实就一句话条件是一个个往下检查的谁先命中谁生效。题目3读代码写出输出结果。a 10 b 20 if a 5 and b 15: print(条件1成立) elif a 5 or b 30: print(条件2成立) else: print(都不成立)答案条件1成立。这里考的是and和or的优先级以及短路求值。第一个条件a 5为真b 15也为真所以整个and表达式为真直接走第一个分支。很多同学在这里不会错但紧接着我还会问一个问题如果把a改成 3会输出什么答案是条件2成立因为a 5 or b 30中a 5为假但b 30也为假两个都为假or的结果是假所以走else输出都不成立。这里最容易出错的地方是混淆or和and的真假判断。3.2 第二组for 循环与 range()题目4写出下面两段代码的输出差异。for i in range(5): print(i, end )for i in range(1, 5): print(i, end )答案第一段输出0 1 2 3 4第二段输出1 2 3 4。这道题就是为了敲打range 左闭右开这个点。很多人在使用range(5)时天然觉得会输出1 2 3 4 5因为在自然语言里5个数字容易联想到从 1 数到 5。但 Python 的range是从 0 开始的并且不包含结束值。把它和下标从 0 开始这个规则结合起来理解你就不会记错了——Python 里列表的索引也是从 0 开始循环遍历列表时for i in range(len(my_list))正好能覆盖所有合法下标。题目5写出下面代码的输出结果。total 0 for i in range(1, 101): total i print(total)答案5050。这就是经典的1 加到 100问题。正确答案是 5050这个数字本身有很好的校验作用凡是算出别的数肯定是边界写错了。最常见的错误是写range(1, 100)这样只能加到 99结果是 4950。另一种错误是写成range(0, 101)也能算对因为加 0 不影响结果但写法不够直接。我建议你记住range(1, 101)这个标准写法因为在 Python 里包含 1到 100 为止就是这么表达的。如果题目要求的是1 到 100 的所有奇数之和你还可以写成range(1, 101, 2)这样每次跳两步更高效。3.3 第三组while、break 与 continue题目6写出下面代码的输出结果。n 1 while True: if n 5: break print(n) n 1答案输出1 2 3 4 5。这道题考的是while True配合break的经典模式。while True本身是一个永不结束的条件唯一能让循环停下来的是循环体里的break。执行过程是这样的n 1进入循环。判断n 5此时是 1不大于 5不执行 break。打印 1n变成 2。继续循环直到n 6时n 5成立执行 break循环结束。这个模式在实际项目中非常常见比如写一个菜单系统用户输入 1、2、3 分别做不同事情输入 0 就退出这时用while True加上内部break就很自然。注意break的位置很关键如果break写在print(n)后面结果就会变成先打印 6 再结束。批改时经常有人问为什么我加了break还是停不下来答案往往是break放错了位置或者压根没进到if里。题目7写出下面代码的输出结果。for i in range(1, 8): if i % 2 0: continue print(i, end )答案输出1 3 5 7。这道题考的是continue的作用。当i是偶数时continue会跳过本次循环剩余的代码直接进入下一次循环所以print(i)永远不会打印偶数。执行过程其实是这样的i 1不是偶数打印 1。i 2是偶数continue跳过打印。i 3不是偶数打印 3。i 4是偶数跳过。依次类推直到i 8超出 range 的范围循环结束。这里最常见的问题是把continue理解成终止循环这和break混淆了。我教你一个记忆方法break是破门而出整个循环直接结束continue是继续只是跳过这一轮后面接着跑。3.4 第四组嵌套循环与独立编程题题目8写出下面代码的输出结果。for i in range(1, 4): for j in range(1, 4): print(f{i}*{j}{i*j}, end ) print()答案1*11 1*22 1*33 2*12 2*24 2*36 3*13 3*26 3*39嵌套循环是这一章真正的难点它的关键在于理解外层循环每执行一次内层循环要完整执行一整轮。拿这道题来说外层i从 1 变到 3每取一个i内层j都要从 1 跑到 3所以总共是 3×39 次输出。内层循环结束后print()会把光标移到下一行所以i1的整行排在第一行i2排在第二行以此类推。我批改时发现嵌套循环出错最多的地方不是逻辑本身而是缩进。有人把print()放在内层循环里面结果每个乘法后面都换一次行输出变得歪歪扭扭。这里你要记住冒号后面属于哪一层看缩进就能判断。缩进相同的代码属于同一个代码块内层的代码块一定要比外层多缩进一层。题目9独立编程题。写一个程序输出 1 到 20 之间的所有偶数并计算这些偶数的总和。这里我提供一个参考解total 0 for i in range(1, 21): if i % 2 0: print(i, end ) total i print() print(总和是, total)输出结果是2 4 6 8 10 12 14 16 18 20 总和是 110这道题我给出的解法用if来筛选偶数这是一个很自然的思路。不过其实还有更聪明的写法直接用range(2, 21, 2)一步到位生成所有偶数完全不需要if判断。两种方法都能通过但后者明显效率更高、代码更简洁。我希望通过这道题传达一个理念同样一道题有多种解法写完代码后不妨想一想还能不能更简洁。在实际工程项目里代码的简洁和清晰往往比小聪明更重要。4. 批改中遇到的真实错误与排查方法4.1 缩进错误Python 代码最容易被外貌打败Python 和其他语言最大的不同就是用缩进表示代码块。我在批改这份测验时看到的最多的一类错误就是缩进混乱。比如有人写for i in range(5): print(i)这段代码跑起来会直接报IndentationError: expected an indented block。原因很简单for的循环体没有缩进Python 不知道循环体去哪了。我的建议是务必统一用 4 个空格或一个 Tab但不要混用。VSCode 里可以在右下角设置缩进方式。还有个小技巧当你看到unexpected indent或者expected an indented block这类报错时先别急着看逻辑先回头检查缩进。4.2 死循环排查实录while 条件永远为真有一次我问一个同学他写的这段代码为什么一跑就卡死n 1 while n 100: print(n)我让他把n 1加进去他一脸疑惑地问我为什么一定要加Python 不是自动递增吗这个认知误区其实很常见关键在于while循环不像for循环那样会自动从容器里取下一个值它每轮只检查一次条件至于条件是真是假完全取决于你在循环体里对变量做了什么。如果不更新nn永远是 1条件永远成立于是就成了死循环。排查死循环有一个很实用的方法如果程序运行后卡住不动我建议你先按Ctrl C强制中断让 Python 报出当前卡在哪个循环的哪一行。或者你也可以在循环体里临时加一句print(n)看看变量到底有没有在更新。这种插桩打印的方法虽然笨但在调试基础语法时比任何高级工具都好用。4.3 边界问题多一次、少一次差之毫厘谬以千里range()的边界问题几乎每天都能在作业里看到。最常见的是这两种for i in range(1, 100): # 只能循环到 99 print(i) for i in range(0, 100): # 多循环了一次 0 print(i)我的避坑方法是动笔之前先确认我想让循环从哪个数开始、到哪个数结束、结束的那个数要不要包含。如果要求是 1 到 100 全部包含就把范围写成range(1, 101)如果要求是不包含末尾比如循环 10 次直接用range(10)是最稳妥的。另外在写循环时把结束值单独提出来定义成一个变量也是个好习惯比如end 101这样代码的可读性会好很多。4.4 条件判断中的短路求值and 和 or 的隐藏行为and和or在 Python 里除了用于条件判断还有一个特性叫短路求值。简单说and左边为假时右边根本不会执行or左边为真时右边也不会执行。这个特性在某些场景下很有价值但也容易带来隐晦的 bug。举个例子def func(): print(函数被调用了) return True if 0 and func(): print(不会到这里)这段代码的输出只有函数被调用了吗不对因为0是假值and直接短路func()根本不会执行所以函数被调用了也不会打印。我在测验里没有专门出这种题但每次讲到这里都会提醒一句如果你在and或or的右边写了有副作用的函数调用请一定想清楚它到底会不会被执行。5. 做完这套题之后我的几点个人建议这套题我只给过一个很粗略的分数参考读代码题每道 10 分写代码题 30 分满分 100 分拿到 80 分以上条件判断和循环这块基础就算过关了。但我更想说的是分数本身不重要重要的是你在做题过程中暴露出来的问题。我自己带过很多从零基础起步的人凡是能在这一章把if、for、while、break、continue之间的关系理清楚的人后面学函数、学数据容器、学稍微复杂一点的项目基本都不会有大碍反过来这一章靠背题混过去的人学到面向对象时往往会加倍痛苦。如果你发现自己某些题目做错了我建议你接下来三件事第一把错题的代码亲手敲一遍把输出结果盯一遍第二尝试改一点参数比如把range(1, 101)改成range(1, 51)看看输出怎么变化理解边界第三试着用两种不同方式重写同一道题比如把for循环改成while循环。这样折腾一轮你对条件判断和循环的理解会比做十套新题都扎实。最后分享一个我自己的习惯学循环和条件判断这种基础语法时不要光看教程建议开一个独立的练习脚本把每道题的代码都存下来在每段代码下面写一句注释说明这段代码想表达什么。等你学完函数再回来看这些注释会发现自己进步得特别明显。
返回列表