ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Python分支结构习题001:if/elif/else条件判断实战详解

Python分支结构习题001:if/elif/else条件判断实战详解 初学 Python 的时候很多人的第一个快乐来自print(Hello World)但真正觉得“哦我好像会写程序了”往往是做到python习题001-----分支结构这类题目的时候。你开始让代码自己根据条件做选择而不是从上到下傻跑一遍。分支结构就是 Python 里的if、elif、else这套东西它是控制程序流向的第一块基石后面写爬虫、自动化脚本、数据处理甚至搞个练习题集、设计个菜单逻辑都逃不开它。今天这篇就把这道经典习题拆开揉碎从环境准备、语法细节、实战做题到排查踩坑一次性讲透。适合刚装好 Python、准备开始刷题的人也适合已经能跑通简单代码、但一遇到“多条件判断”就卡壳的朋友。1. 先搞明白分支结构到底在干嘛再碰题目1.1 生活里的“分支”和代码里的“分支”很多人觉得“分支结构”是个高深概念其实你每天出门前都在写代码如果下雨我就带伞否则我就不带伞。这句话翻译成 Python 就是if 下雨: 带伞() else: 不带伞()只不过真实程序里“下雨”不是一个天气事实而是一个布尔表达式——要么是True要么是False。程序运行到if这一行时会对条件做一个真假判断然后决定执行哪一块代码。执行完选中的分支之后整个if结构结束程序继续往下走。我在带新人的时候喜欢画一条直线来表示代码执行顺序从文件开头一路往下遇到if就像在直线中间开了一个岔路口每走一个分支就会合并回主路。这个图式比背任何概念都管用。1.2 “习题001”考察的到底是哪个点只看“分支结构”四个字题目的具体形式可能千差万别但万变不离其宗。我整理过一批常见版本常见题目核心考察点输入一个数判断正负或奇偶取余运算%、比较运算符输入成绩判断优秀/良好/及格/不及格多条件顺序、区间判断输入年份判断是否为闰年逻辑运算符 and/or、嵌套分支输入三个数输出最大值比较运算符、临时变量输入三角形三边判断类型多条件组合、边界值处理你会发现所有题最终都在干同一件事把复杂的真实规则拆成“条件 结果”再交给 Python 去判断。所以做题之前先别急着敲键盘把题目里所有可能的情况列出来尤其要想清楚哪些情况是互斥的哪些情况可能同时成立哪些情况属于“剩下的其他所有”。1.3 开工前把环境一次配好后面少受气做这道题不需要很重的工具但前提是 Python 这个解释器得装好。如果你是刚入门我建议直接去 python.org 下载安装包安装时务必勾选Add Python to PATH这一步能省掉后面一堆“python 不是内部或外部命令”的哭喊。装完之后打开 VSCode安装一个 Python 扩展新建文件命名为exercise_001.py。运行方式有两种在 VSCode 里右键代码区选择“Run Python File in Terminal”打开系统终端cd到文件所在目录输入python exercise_001.py回车两种都行我的建议是前期用命令行跑因为你能更直观地看到输入、输出和报错信息。等后面代码复杂了再用 VSCode 的调试功能。1.4 顺便泼一盆冷水git 分支和这个“分支结构”不是一回事好多人搜“python 分支结构”的时候莫名其妙搜出一堆 Gitee 或者 Git 的 branch 指令然后彻底懵了git branch、git checkout、git merge……这是版本控制里的分支指的是代码库开发路线的分叉操作指令是git branch xxx、git checkout xxx而我们说的 Python 分支结构是程序运行时的条件跳转机制完全不同。两者唯一的共同点就是名字里都有“分支”两个字。搜索的时候建议带上“Python 语法”或者“if else”这样能少走很多弯路。别问我怎么知道的我带过的学员里至少有两个人因为这个跑偏了一下午。2. 核心语法拆解if、elif、else 与缩进2.1 if 的最小模型Python 里最基础的分支写法长这样if 条件: 执行语句注意两个细节第一条件后面必须有一个冒号英文的冒号写完条件顺手就打出来。漏冒号是新手报错排行榜前三名。第二下一行必须缩进。Python 不靠大括号{}来划代码块它靠缩进。缩进 4 个空格是官方推荐做法也是社区共识。下面这个最简单的例子就是把条件换成比较运算age 18 if age 18: print(你已经成年了)你可以把age改成 15 再跑一遍会发现print那行不会执行。这就是分支结构最原始的意义某段代码是否执行由条件决定。2.2 多条件互斥时用 elif别用一排 if很多新手会写出一长串独立的if比如score 95 if score 90: print(优秀) if score 80: print(良好) if score 60: print(及格)当 score 等于 95 时程序会从第一个if开始依次检查三个条件全都成立于是“优秀”“良好”“及格”三个结果都会被打印出来。这显然不是我们想要的。正确做法是把条件改成互斥结构score 95 if score 90: print(优秀) elif score 80: print(良好) elif score 60: print(及格) else: print(不及格)elif是else if的缩写含义是只有当前面所有条件都不成立时才继续判断这个条件。程序一旦命中某个分支就会跳过整个if/elif/else结构继续往下执行。这里有个顺序原则要记牢多个区间互斥时一定要想清楚先判断哪个。一般建议先处理最特殊、范围最小的条件或者先从高到低排序。如果你先写if score 60再写elif score 90那么 95 分永远会走进“及格”分支“优秀”分支直接躺平后面永远等不到执行。2.3 else 不是万能兜底else看起来是“否则”好像能接住所有没列出来的情况。但在真实项目里它往往才是错误的温床。比如你写score 85 if score 60: print(及格) else: print(不及格)看起来没什么问题。但假如用户输入的是105或者-10程序也会把它当成“及格”或“不及格”处理而不是提示输入不合法。这种逻辑用在练习里能跑不代表它是健壮的。更稳妥的做法是先把边界值拦住score int(input(请输入成绩0到100)) if score 0 or score 100: print(成绩超出范围) elif score 60: print(及格) else: print(不及格)把else当作“剩余情况的处理”而不是“正常情况的兜底”。每次写else之前问自己一句真的所有剩余情况都是这个结果吗2.4 嵌套分支一层套一层但别套太深有些判断需要先满足一个大的前提再在大前提下细分。这时候可以用嵌套if里面再写一个if。比如登录判断的逻辑username input(用户名) password input(密码) if username admin: if password 123456: print(登录成功) else: print(密码错误) else: print(用户名不存在)这种“先粗后细”的写法符合人类思维但是嵌套层级越多代码越难读。我给自己定了个规矩超过三层缩进就说明该重构了。要么把内层条件拆成函数要么用逻辑运算符合并条件。上面的登录判断也可以改写成单层if username admin and password 123456: print(登录成功) elif username ! admin: print(用户名不存在) else: print(密码错误)具体选哪种看你的业务需求。如果每种情况都有独立操作嵌套清晰如果只是几个固定条件的组合单层加逻辑运算符更扁平。2.5 条件表达式、逻辑运算符与优先级分支结构的条件部分通常由比较运算符和逻辑运算符组成。比较运算符有这些、!、、、、结果一定是布尔值True或False。逻辑运算符有三个and、or、not。它们的优先级从高到低是notandor。这个顺序经常被忽略比如下面的例子if not score 60 and score 100: print(范围内但有风险)实际执行顺序是not (score 60)先算再与score 100做 and。如果你本意是not ((score 60) and (score 100))结果完全不同。所以条件长了别偷懒用括号把每一步都写清楚这不算丢人。Python 还有一个很舒服的特性就是支持链式比较if 60 score 80: print(中等成绩)这比if score 60 and score 80更贴近自然语言也更少出错。我在写区间判断时基本都优先用链式写法。3. 实操过程从题目到可以跑的“习题001”程序3.1 先定题目就用最经典的“奇偶判断”为了演示完整流程我把今天的“习题001”定为输入一个整数判断它是奇数还是偶数并输出结果。这道题在各类入门练习册中出现的频率非常高因为它包含分支结构最典型的两条路径还牵涉到取余运算%和input()的数据类型问题。先理清规则一个整数能被 2 整除就是偶数不能被 2 整除就是奇数0 是偶数这个规则足够简单但它能覆盖负数、0、大数值、非法输入四种边界情况很适合作为新手第一题。3.2 第一版打开编辑器直接写最小的判断先跑通最核心的逻辑其他防护后面再加num int(input(请输入一个整数)) if num % 2 0: print(偶数) else: print(奇数)解释一下这四行input()接收键盘输入得到的是字符串int()把字符串转换成整数num % 2计算 num 除以 2 的余数余数为 0说明能整除进入“偶数”分支否则进入“奇数”分支运行一下输入 4输出“偶数”输入 7输出“奇数”。看起来没问题但如果你输入的是abc程序会直接崩掉报错ValueError: invalid literal for int()。这就是第一版的问题完全没有处理非法输入。3.3 第二版处理“不是整数”的输入体验一次更完整的分支去掉非法输入的方式有很多最贴合当前学习阶段的做法是先用字符串方法判断一下再转整数。因为isdigit()只能判断非负整数正好可以配合lstrip(-)支持负数s input(请输入一个整数) if s.lstrip(-).isdigit(): num int(s) if num % 2 0: print(偶数) else: print(奇数) else: print(输入不合法请输入整数)拆开看lstrip(-)会去掉字符串最左边的负号这样-3变成3isdigit()返回 True-单独输入时去掉负号后变成空字符串isdigit()返回 False会被判定为非法输入3.14时因为包含小数点isdigit()返回 False也会走“输入不合法”分支第二版之后负数、小数、空字符串都被挡在外面逻辑更完整。这里其实已经用到嵌套分支外层判断输入是否合法内层判断奇偶。3.4 第三版稍微扩展成“成绩等级”题把 elif 练熟奇偶判断只有两个分支对elif的练习偏少。所以我建议你在同一个“习题001”里再写一个变体比如成绩等级判断s input(请输入成绩0到100) if not s.isdigit(): print(输入不合法请输入非负整数) else: score int(s) if score 100: print(成绩超出范围) elif score 90: print(优秀) elif score 80: print(良好) elif score 60: print(及格) else: print(不及格)这里的关键是score 100必须放在最前面。因为如果先判断score 90那么输入 95 时会合理输出“优秀”但如果输入 105它也会输出“优秀”这不符合题意。边界值优先拦截再进入正常区间是分支结构里很重要的一个习惯。你也可以用chain写法替代比如if score 100之后写elif 90 score 100这会让区间表达更明确。3.5 用调试模式把每一步看明白写完代码不要急着交差把它跑起来测一批用例。我习惯写一个简单的测试表输入期望输出实际输出4偶数偶数7奇数奇数0偶数偶数-3奇数奇数abc输入不合法输入不合法105成绩超出范围成绩超出范围95优秀优秀59不及格不及格如果实际输出和期望不一致可以在 VSCode 里点击行号设置断点选择左侧“Run and Debug”里的“Python Debugger”然后逐行执行。调试模式里能实时看到每一个变量的值比盲猜代码不知道高效多少倍。4. 真正让人抓狂的坑常见问题与排查技巧实录4.1 漏掉冒号编辑器直接报语法错最常见的报错长这样SyntaxError: expected :原因就是if、elif、else那行末尾没有冒号。别笑这个错我在手写代码示范时也犯过尤其是从其他语言转过来的人总想写大括号。解决方案很简单顺手打冒号养成肌肉记忆。另外IDE 报错时不要只看“错误提示”直接把光标移到红色波浪线那一行通常一眼就能找到问题。4.2 缩进错误看起来对齐了其实没有Python 对缩进极其敏感。下面这段代码直接会报错if True: print(hello)报错内容是IndentationError: expected an indented block。意思是if下面必须有一个缩进的代码块而不是顶格写。另一种缩进错误更隐蔽就是混用 Tab 和空格。可能你看着编辑器里是对齐的但 Python 精确计算缩进字符Tab 和空格算出的空格数不一样于是报TabError: inconsistent use of tabs and spaces in indentation。我的建议是在 VSCode 里设置editor.insertSpaces为 true并把tabSize设为 4。然后在命令面板里输入 “Convert Indentation to Spaces”一键把历史文件里的 Tab 也统一成空格。这样可以一劳永逸地避开这个坑。4.3 单个等号与两个等号赋值和比较的乌龙新手最爱犯的一个错是把条件写成if num 5: print(等于5)结果报错SyntaxError: invalid syntax。因为在 Python 里单个是赋值两个才是比较。条件判断里必须用两个等号。这个错误看起来低级但很容易出现尤其在连续写了几行赋值之后顺手就写错了。遇到这种报错先检查是不是把写成了。另外还要注意有些从 C 或 JavaScript 转过来的同学习惯把比较的写法和常量调换位置比如if 5 num这在 Python 里可以但不必要。直接写成if num 5更自然。4.4 input() 返回的是字符串不是数字这是分支结构题目中出错率最高的原因。看这段代码score input(请输入成绩) if score 60: print(及格)乍一看没问题但运行时会报错TypeError: not supported between instances of str and int。因为input()永远返回字符串而85是一个字符串不能直接和整数60比较。更隐蔽的是把两个字符串比较score input(请输入成绩) if score 60: print(及格)这样不会报错但字符串比较是按字典序来的100和60比较时先比第一位字符1和6结果是100 60于是 100 分被判为不及格。这种隐蔽逻辑错误比报错更可怕。所以我的经验是使用input()之后立刻考虑当前数据到底是什么类型。如果要做数值比较先转换再比较转换之前先校验合法性。4.5 条件顺序不合理后面分支永远执行不到很多人会遇到这种情况输入 95期望输出“优秀”结果输出“及格”。看代码score 95 if score 60: print(及格) elif score 90: print(优秀)因为 95 已经大于 60第一个分支成立程序直接退出整个判断结构后面的elif根本不会执行。这就是条件顺序选择的悲剧。要解决这个问题只需要记住一个原则范围大的条件往后放范围小的条件往前放。在成绩分级里90 到 100 是更精确的区间应该放在 60 以上这个粗略区间之前。或者反过来把所有条件都写成精确区间比如elif 90 score 100这样顺序影响就会小很多。4.6 一套排查思路先用 print 探路再谈修改程序结果不符合预期时我永远建议先加调试输出而不是直接改代码。比如你怀疑成绩变量有问题就在if前面加一句print(type(score), score)先确认score到底是字符串还是整数再确认实际值是多少。条件判断出错八成是数据类型的错两成是条件顺序的错剩下的一般是逻辑搭配错误。还有一个很土但很有用的办法把每个分支都打印一条标记比如走进else时打印一句“进入 else”。这样你就知道程序到底走的是哪条路。调试完之后再删掉这些临时print不影响最终代码。5. 巩固与进阶把分支结构练出肌肉记忆5.1 新手可以刷的十道题做题是掌握分支结构最快的路径。我整理了一份十道题的清单难度从低到高你可以一天做两题边做边总结。不要只求跑通还要试着给自己加边界测试。输入一个整数判断它是正数、负数还是零输入一个整数判断奇偶且支持负数输入百分制成绩输出优秀、良好、及格、不及格非法输入要提示输入年份判断是否为闰年能被4整除但不能被100整除或者能被400整除输入三个数用分支结构输出其中最大的数输入一个字符判断它是字母、数字还是其他字符输入三条边长判断能否构成三角形能构成的话是等边、等腰还是普通三角形做一个简单计算器输入两个数和运算符输出结果除数不能为0根据年龄输出年龄段儿童、青少年、中年、老年自己定区间写一个“今日穿衣建议”程序根据温度和是否下雨输出不同建议做完这十道题你对if / elif / else的理解会扎实很多。尤其是闰年和三角形两道题逻辑嵌套和边界判断都很经典值得反复写几遍。5.2 条件表达式当只有两个结果时可以给代码减肥分支结构还有一种简写形式叫条件表达式也有人叫三元表达式。格式如下result 值1 if 条件 else 值2举个例子age 20 status 成年 if age 18 else 未成年 print(status)这就是一句if/else但只适合两个简单结果的场景。如果逻辑里还夹着函数调用或者多个条件写完整分支会更清晰。我以前写代码喜欢用三元表达式后来维护别人代码时发现嵌套三层的三元表达式根本不想看。所以你可以在简单场景里用它比如给变量赋默认值。5.3 Python 3.10 之后的 match-case另一种多分支选择Python 3.10 加入了match-case语法上有点像其他语言的switch-case。它也属于分支结构的范畴适合用在“匹配固定值”的场景command input(输入指令start/stop/help) match command: case start: print(程序开始) case stop: print(程序停止) case help: print(帮助信息) case _: print(未知指令)case _相当于默认分支用来匹配其他所有情况。看到这个语法不用急着把它当成主力。match-case对结构化的数据匹配更擅长但基础的条件判断、区间比较、逻辑组合if / elif / else依然是最普适的工具。先把if体系练熟再多学一种写法只会让你更灵活。5.4 一点个人练习心得我每次带新人做分支结构习题都会要求他们在敲代码之前先用文字把逻辑列出来。比如“习题001奇偶判断”先在纸上写输入合法性判断是否能被2整除输出对应结果这样看着很简单但它会逼你把“边界条件”放在代码的第一位。很多老手写的代码之所以稳定不是因为语法多熟练而是因为他们习惯在写主逻辑之前先把异常和边界想清楚了。另外还有一个习惯值得养成每个练习文件都好好命名比如exercise_001_branch.py并在文件头部写注释说明题目和思路。当年我觉得这是浪费时间后来翻自己旧代码的时候才发现那些随手写的test1.py、1.py根本不知道当时在干嘛。规范不是装样子是在帮自己省时间。
返回列表