资讯动态

Python顺序与分支结构22题实战:从输入处理到浮点数精度

发布时间:2026/10/16 5:30:24 来源:尧图企业网站定制
1. 从3-1到3-22这套题到底在练什么很多人第一次打开这套第三章的编程题看到3-1到3-22密密麻麻排下来第一反应是“怎么这么多”。但如果你把这22道题从头到尾刷一遍会发现它们其实不是零散的知识点堆砌而是一条设计得相当紧凑的能力爬坡路线。我前后带过几批刚入门Python的同学做这套题最大的感受是它把“顺序结构”和“分支结构”这两个最基础但最容易翻车的东西用22个不同角度反复捶打直到你形成肌肉记忆。先说清楚这套题的定位。它对应的是程序设计课程里“顺序与分支”这一章核心就两件事一是让程序按你写的顺序老老实实执行二是让程序在某个岔路口做出正确判断。听起来简单但真正写起来新手最容易栽在三个地方——输入格式没吃透、边界条件没考虑、浮点数比较想当然。这22道题几乎每一道都在这些坑上做了埋伏。我建议的刷题节奏是这样的3-1到3-6属于热身区主要练基本输入输出和简单运算3-7到3-14进入分支结构的核心地带if-elif-else的嵌套开始变多3-15到3-22则是综合应用题目里会混入一些需要你同时处理多个条件和多种情况的场景。如果你时间紧至少要把3-7、3-9、3-11、3-13、3-17、3-19、3-21这几道反复做两遍它们分别代表了不同类型的判断逻辑。还有一个很多人忽略的点这套题对输入格式的考察非常细致。有的题要求一行读入多个数有的题要求先读一个整数再读一行字符串有的题输入里带空格和换行。如果你只会用input()读一行然后split()遇到某些题就会卡住。所以我在后面的章节里会专门讲输入处理的几种套路这是刷这套题的基本功。提示不要一上来就想着用花哨的写法。这套题的价值在于让你把最朴素的逻辑写对而不是炫技。先把每道题用最直白的方式写出来跑通再考虑优化。2. 输入处理这22道题里最容易翻车的第一关2.1 一行多个数到底怎么读才不出错这套题里大量题目要求你在一行里读入多个数值比如“输入两个整数输出它们的和”。看起来简单但新手经常写出这样的代码a, b input().split() print(a b)然后发现输出是35而不是8因为split()出来的是字符串a b做的是字符串拼接。正确的做法是转成整数a, b map(int, input().split()) print(a b)这里map(int, ...)的作用是把split()得到的每个字符串都转成整数。我见过有同学写成a, b int(input().split())这会直接报错因为int()不能接受一个列表。这个错误在3-1到3-5里出现频率极高几乎每批学生里都有一半人会踩。还有一种情况是输入的数字个数不确定比如一行里可能有3个数也可能有5个数。这时候就不能用a, b ...这种固定解包了得用列表接住nums list(map(int, input().split()))然后根据len(nums)来判断后续怎么处理。3-8和3-12里就有这种设计题目不会明说“输入个数不定”但你看样例输入会发现每行数字数量不一样。2.2 带空格的字符串输入怎么处理有些题目的输入里包含字符串而且字符串本身可能带空格。比如“输入一个名字和一个年龄”名字可能是“Zhang San”这种带空格的。这时候如果你用input().split()会把名字拆成两段导致后面的变量对不上。处理这种输入有两种常见做法。第一种是用split(maxsplit1)只分割一次name, age input().split(maxsplit1) age int(age)这样name会拿到“Zhang San”age拿到“18”。第二种是如果题目明确说名字不带空格那就正常split()就行。关键是要先看清楚题目对输入的描述不要想当然。3-15和3-18里就有这种带空格字符串的输入很多同学在这里卡了很久反复检查逻辑都没错最后发现是输入读错了。我的经验是拿到一道题先把样例输入复制出来在脑子里过一遍input()读到的到底是什么再动手写代码。2.3 多行输入与循环读取的配合从3-16开始有些题目要求读入多行数据比如第一行是测试用例个数后面跟着若干行具体数据。这种结构在后续章节里会越来越常见第三章算是提前让你适应。典型写法是这样n int(input()) for _ in range(n): line input() # 处理每一行这里有个细节如果第一行读完之后后面的行里可能有空行input()会读到空字符串。有些题目会故意在输入里加空行来考验你这时候需要加一个判断line input().strip() if not line: continue3-20里就有类似的情况输入数据中间夹了一个空行如果不处理程序会在split()之后解包失败。这个坑我在第一次做的时候也踩过当时盯着报错信息看了半天才反应过来是空行的问题。注意input()读到的字符串末尾可能带换行符虽然Python的input()会自动去掉末尾换行但如果你用sys.stdin读就不一定了。第三章的题目用input()足够不需要上sys.stdin。3. 分支结构从3-7开始if-elif-else的嵌套逻辑怎么理清3.1 为什么你的elif顺序总是写反3-7到3-10这几道题是分支结构的入门题目通常是根据某个数值的范围输出不同结果。比如“成绩大于等于90输出A大于等于80输出B以此类推”。很多同学写出来的代码是这样的if score 60: print(D) elif score 70: print(C) elif score 80: print(B) elif score 90: print(A)然后发现90分输出的是D。原因很简单if-elif是从上往下依次判断的一旦某个条件满足后面的就不再看了。所以范围判断必须从大到小或者从小到大按顺序写不能乱。正确的写法有两种。第一种是从高到低if score 90: print(A) elif score 80: print(B) elif score 70: print(C) elif score 60: print(D) else: print(E)第二种是从低到高但条件要写成“小于”的形式if score 60: print(E) elif score 70: print(D) elif score 80: print(C) elif score 90: print(B) else: print(A)两种都对但不要混着写。我见过有同学写成if score 60然后elif score 70这就是典型的顺序错误。这个坑在3-7和3-9里各出现一次做的时候一定要在脑子里过一遍边界值比如90、89、60、59这些数分别会走到哪个分支。3.2 嵌套分支什么时候该缩进什么时候该拆开3-11到3-14开始出现嵌套分支也就是在一个if里面再写一个if。比如“判断一个年份是不是闰年如果是闰年再判断是不是世纪闰年”。这种题目的逻辑本身不复杂但缩进一多就容易乱。我的建议是如果嵌套超过两层就考虑把内层逻辑抽成一个独立的条件表达式或者用and、or把条件合并。比如判断闰年的经典逻辑if (year % 4 0 and year % 100 ! 0) or (year % 400 0): print(是闰年) else: print(不是闰年)这样写比嵌套两层if要清晰得多。3-13就是一道闰年判断题用合并条件的方式写出来只有四行用嵌套写要十几行而且容易漏掉year % 400 0这个分支。但有些题目确实需要嵌套比如“先判断输入是否合法如果合法再判断属于哪个范围”。这时候嵌套是合理的但要注意把最可能不满足的条件放在最外层尽早return或者跳过减少缩进层级。3-14里有一道题就是这种结构我当时的写法是先判断输入是否为正数如果不是就直接输出错误信息后面的逻辑就不用再缩进了。3.3 布尔表达式里的短路求值一个容易被忽略的细节Python的and和or有短路求值的特性也就是说A and B里如果A是FalseB根本不会被计算。这个特性在第三章的某些题目里会影响到你的写法。举个例子3-17里有一道题要求“判断一个数能否被3和5同时整除”。你可以写if num % 3 0 and num % 5 0: print(能同时整除)这没问题。但如果你写成if num % 3 0: if num % 5 0: print(能同时整除)效果一样但第一种更简洁。短路求值在这里不会出问题因为两个条件都是安全的。真正需要注意的是当条件里包含可能报错的操作时。比如if len(s) 0 and s[0] a如果s是空字符串len(s) 0是False后面的s[0]就不会执行不会报IndexError。但如果你把顺序反过来写成s[0] a and len(s) 0空字符串就会直接报错。这个细节在3-19里有一道字符串判断的题目会用到虽然题目本身不难但理解短路求值能让你写出更安全的代码。4. 浮点数与精度3-21和3-22里埋的坑4.1 为什么0.1加0.2不等于0.33-21和3-22这两道题涉及到浮点数运算很多同学在这里第一次遇到“明明算出来应该是相等的但程序就是不认”的情况。比如a 0.1 0.2 if a 0.3: print(相等) else: print(不相等)输出是“不相等”。原因是计算机用二进制表示浮点数0.1和0.2在二进制里都是无限循环小数存储时会有微小误差加起来不等于精确的0.3。正确的比较方式是判断两个数的差值是否小于一个很小的阈值if abs(a - 0.3) 1e-9: print(相等)1e-9就是10的负9次方也就是0.000000001。只要差值小于这个数就认为它们相等。这个技巧在3-21里判断三角形是否成立时会用到因为三条边都是浮点数直接比较可能会因为精度问题误判。4.2 输出格式化保留几位小数到底怎么写3-22要求输出结果保留两位小数很多同学用round()函数但round()有时候会出现“四舍六入五成双”的情况比如round(2.675, 2)得到的是2.67而不是2.68。这是因为2.675在二进制里存储的值略小于2.675。更稳妥的方式是用格式化字符串print(f{result:.2f})或者print(%.2f % result)这两种方式都会按照标准的四舍五入规则输出两位小数。3-22的样例输出里明确要求两位小数用round()可能会在某些边界值上翻车用格式化字符串就没这个问题。还有一个细节如果结果是整数比如3.0格式化输出会变成3.00这是符合题目要求的。但如果你用round(3.0, 2)输出是3.0少了两位小数反而不符合要求。所以格式化字符串在这类题目里是更可靠的选择。提示第三章里涉及浮点数的题目不多但3-21和3-22这两道一定要认真做。浮点数精度问题在后面章节里会反复出现现在把坑踩明白后面能省很多时间。5. 那些年我们一起踩过的边界条件5.1 输入为0、负数、空字符串时程序会不会崩这套题里很多题目对边界条件有隐含要求但题目描述里不会明说。比如3-6要求“输入一个整数输出它的绝对值”如果你只考虑正数写print(num)就错了因为负数要取反。正确的写法是if num 0: num -num print(num)或者直接用abs(num)。但有些同学会写成print(abs(num))这没问题但如果是更复杂的场景比如“输入一个数如果是负数输出它的平方否则输出它本身”就需要用分支来处理。3-10里有一道题要求“判断一个数是否为正数、负数或零”三个分支都要考虑到。我见过有同学只写了正数和负数两个分支零的情况漏掉了结果输入0的时候程序什么都不输出。这种边界条件在考试里是扣分重灾区平时练习就要养成习惯每写一个分支都问自己“还有没有其他情况”。5.2 多条件判断里的逻辑漏洞怎么排查3-18是一道综合判断题需要同时考虑多个条件。这种题目最容易出现逻辑漏洞比如“判断一个三角形是否成立”需要满足“任意两边之和大于第三边”但很多同学只判断了“两边之和大于第三边”中的一组漏了另外两组。排查这种逻辑漏洞的方法很简单把题目里所有“并且”“或者”的条件列出来逐条对照代码检查。比如三角形判断的三个条件a b ca c bb c a三个条件必须同时满足用and连接。如果你只写了第一条那就是逻辑漏洞。3-18的样例输入里有一组数据就是专门用来检测这个漏洞的如果你只判断了一组那组数据就会输出错误结果。我自己的习惯是写完条件判断后用样例输入里的每一组数据手动模拟一遍看看程序会走哪个分支输出是否符合预期。这个方法虽然笨但能抓住大部分逻辑错误。5.3 字符串比较里的隐藏陷阱3-19和3-20涉及到字符串比较这里有一个新手很容易忽略的点Python里字符串比较是按字符的编码顺序来的不是按字母表顺序。比如Z a是True因为大写字母的编码比小写字母小。如果题目要求“按字母顺序比较”而输入里可能有大写也有小写你就需要先统一转成小写再比较s1 input().lower() s2 input().lower() if s1 s2: print(第一个更小)3-19里有一道题就是这种题目说“比较两个字符串的大小”但样例输入里一个大写一个小写如果你直接比较就会得到和预期相反的结果。这个坑我在第一次做的时候也踩了后来养成习惯只要涉及字符串比较先看题目有没有说大小写敏感没有说就统一转小写。6. 从能跑通到写得干净代码风格与调试习惯6.1 变量命名和注释现在偷的懒以后都要还第三章的题目代码量不大很多同学觉得变量名随便起个a、b、c就行注释也不写。但到了后面章节题目复杂度上来之后回头看自己写的a、b、c根本不知道哪个是哪个。我的建议是从第三章开始就养成好习惯变量名用有意义的英文单词比如score、year、radius而不是s、y、r。注释不用多但每个分支在做什么要写清楚。比如# 判断成绩等级 if score 90: grade A elif score 80: grade B # ...这样过一周再看代码一眼就能想起来当时在做什么。3-11到3-14这几道嵌套分支的题目尤其需要注释因为嵌套层级一多过两天自己都看不懂。6.2 用print调试最笨但最有效的方法第三章的题目逻辑不复杂大部分错误通过看代码就能发现。但有些边界条件的错误光看代码看不出来这时候最有效的办法是在关键位置加print把中间变量的值打出来。比如3-17里判断整除的题目如果你不确定num % 3和num % 5的值可以在if之前加一行print(fnum{num}, mod3{num%3}, mod5{num%5})跑一遍样例输入看看输出的中间值对不对。这个方法虽然原始但比盯着代码空想快得多。我带学生的时候经常说宁可加十行print也不要盯着代码发呆十分钟。6.3 提交前的自检清单每道题写完提交之前花30秒过一遍这个清单输入格式对不对是一行多个数还是多行边界条件考虑了没有0、负数、空字符串会不会出问题输出格式对不对有没有多余的空格或换行浮点数保留几位变量类型对不对该转int的转了没有该转float的转了没有这四条看起来简单但第三章里80%的错误都出在这上面。我统计过自己带的学生3-1到3-22这22道题里因为输入格式错误导致的失败占了将近一半因为边界条件漏考虑导致的占了三分之一。真正因为算法逻辑错误的反而不多。注意这套题的评测系统对输出格式要求很严格多一个空格都可能判错。输出的时候尽量用print()直接输出结果不要加额外的提示文字。比如题目要求输出8你就print(8)不要print(结果是8)。7. 几道典型题的完整思路复盘7.1 3-9成绩转换里的分支顺序问题这道题要求根据百分制成绩输出等级90以上A80到89是B以此类推。看起来简单但分支顺序写错就会全盘皆输。我的写法是从高到低判断score int(input()) if score 90: print(A) elif score 80: print(B) elif score 70: print(C) elif score 60: print(D) else: print(E)这里的关键是elif的顺序必须和分数段从高到低对应。如果你写成if score 60在最前面那90分也会走到这个分支输出D。这个错误我在第一次做的时候也犯了后来总结出一个口诀范围判断从大到小或者从小到大不要跳。7.2 3-17整除判断里的逻辑合并这道题要求判断一个数能否同时被3和5整除。最直接的写法是用and连接两个条件num int(input()) if num % 3 0 and num % 5 0: print(Yes) else: print(No)但有些同学会写成嵌套if num % 3 0: if num % 5 0: print(Yes) else: print(No) else: print(No)两种写法结果一样但第一种更简洁。这道题的价值在于让你理解and的用法以及什么时候该用嵌套、什么时候该用合并。我的经验是如果内层if的else和外层if的else输出一样那就合并成and。7.3 3-21三角形判断里的浮点数精度这道题给三条边长判断能否构成三角形。逻辑是任意两边之和大于第三边但边长是浮点数直接比较可能会因为精度问题误判。比如0.1 0.2 0.3在Python里是False因为0.10.2等于0.30000000000000004而0.3是0.29999999999999998。所以判断条件要写成if a b c 1e-9 and a c b 1e-9 and b c a 1e-9: print(能构成三角形) else: print(不能构成三角形)加一个很小的1e-9作为容差避免因为浮点数误差导致误判。这个技巧在3-21里是必须的因为样例输入里就有这种边界数据。7.4 3-22格式化输出的标准写法这道题要求输出结果保留两位小数。最稳妥的写法是result some_calculation() print(f{result:.2f})f{result:.2f}的意思是把result格式化成浮点数保留两位小数。如果结果是3.1输出3.10如果结果是3.14159输出3.14。这种写法比round()可靠因为round()在边界值上可能会出现意外。我见过有同学用print(round(result, 2))大部分情况下没问题但遇到2.675这种数就会输出2.67而不是2.68。虽然第三章的样例数据可能不会触发这个问题但养成用格式化字符串的习惯后面做更复杂的题目时能避免很多麻烦。8. 刷完这22道题之后你该往哪走第三章的22道题刷完你应该已经对Python的基本输入输出、分支结构、浮点数处理有了肌肉记忆。如果让我给一个自检标准你能不能在不看任何参考的情况下20分钟内把3-7到3-14这8道分支题全部写对并且通过评测如果能说明基础打牢了如果还有卡壳的建议把对应的题目再写两遍。接下来第四章会进入循环结构那才是真正开始上强度的地方。第三章里那些输入处理的套路、边界条件的检查习惯、格式化输出的写法在第四章里会反复用到。特别是多行输入的循环读取第三章只是浅尝辄止第四章会变成家常便饭。我个人在实际操作中的体会是第三章的题目不要追求一遍过。第一遍做的时候允许自己犯错但每犯一个错都要搞清楚错在哪里是输入格式没看清还是边界条件漏了还是逻辑顺序写反了。把这些错误记在一个本子上过一周再回来看如果同样的错误不再犯那这22道题才算真正刷到位了。最后再分享一个小技巧如果你在某道题上卡了超过15分钟不要继续死磕先跳过去做后面的。很多时候后面的题目会给你灵感或者你过半小时再回来看思路突然就通了。第三章的题目之间关联性不强跳着做完全没问题。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑