ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Python一级编程题练习卷备考:题型拆解、避坑要点与三阶段冲刺

Python一级编程题练习卷备考:题型拆解、避坑要点与三阶段冲刺 1. 一份编程题练习卷到底在考察什么很多打算考Python一级的同学第一次翻开练习卷的时候都会有点懵明明知识点都背下来了print会写、if会判断、for循环也看得懂但一碰到编程题就不知道从哪下手。这不是个例我见过太多人栽在这一步。编程题练习卷和理论题最大的区别在于理论题考察你知道什么编程题考察你能用代码解决什么。前者的答案藏在选项里后者的答案只能靠你自己一行一行敲出来。尤其是一级题目它不会考你什么高深的算法反而是在用一种特别刁钻的方式考察基础——能不能把老师讲过的知识点组合起来解决一个具体的小问题。那这个阶段的核心考察点到底有哪些程序的基本结构顺序、分支、循环这是所有编程题的骨架。输入输出input()读进来的到底是什么类型print()输出的时候格式怎么控制这俩是一级编程题出现频率最高的考点。数据类型的基本操作字符串切片、列表追加、整数浮点数转换这些东西单拎出来都不难但组合在一起就能变出无数道题。简单的逻辑推理题目不会直接告诉你请用if语句而是给你一个场景比如判断闰年计算水费你得自己从场景里提炼出判断条件。代码阅读能力练习卷里有些题是给你一段代码让你写出运行结果。这种题考的其实是你脑子里能不能模拟CPU的执行过程。很多同学有一个误区觉得一级很简单背背知识点就能过。但我跟你们说编程题恰恰是挂科重灾区。原因很简单选择题你可以蒙判断题你可以猜编程题不会就是不会编译器不会给你留情面。所以一份正经的练习卷它的价值不在于让你见过这些题而在于逼着你在没有提示的情况下把脑子里的知识真正跑起来。我自己带学生的经验是如果一个人能把一张练习卷里80%的编程题独立写出来那他的一级考试基本稳了反过来如果只会看答案、背答案那上了考场大概率还是要慌。2. 按题型拆解从读题到落码的完整思路编程题的题型其实就那么几大类但每一类的处理思路都不一样。我习惯把它们分成四类来讲这四类对应着不同的能力要求大家对照着看看自己哪块最弱。2.1 输入输出类所有题目的地基这类题看起来最简单比如输入两个整数输出它们的和但恰恰是失分最多的部分。为什么会失分因为很多人压根没搞明白input()的特性。input()读进来的永远是字符串这一点我在讲课时反复强调但每次批改作业还是能看到有人栽跟头。字符串做加法是拼接不是数学运算。所以input()之后必须做类型转换这是输入输出类题目的第一个坎。a input() # 这读进来的是字符串 b input() print(a b) # 如果输入1和2输出的是12而不是3正确的做法是a int(input()) # 转换成整数 b int(input()) print(a b) # 输出3第二个容易失分的地方是输出格式。一级考试特别喜欢考保留两位小数用空格隔开换行输出这类要求。有些同学算对了结果却因为格式不对被扣分非常可惜。# 要求输出一个浮点数保留两位小数 pi 3.14159 print(%.2f % pi) # 老式写法 print(f{pi:.2f}) # f-string写法2.2 分支判断类把生活场景翻译成条件这类题通常会给你一个实际场景比如根据成绩输出等级根据月份判断天数计算阶梯电价。核心就一件事把题目描述转化成逻辑表达式。我教学生的时候会让他们先干一件事——不要急着写代码先在草稿纸上把条件列出来。比如成绩大于等于90为优秀大于等于80为良好那你就要先写成如果 成绩 90优秀 否则 如果 成绩 80良好 否则继续判断这里面有个经典陷阱条件顺序。很多同学上来就写if 成绩 60把最简单的条件放前面结果后面的分支永远不会执行。写分支判断的第一个原则是从范围大的、严格的条件开始逐步缩小。score int(input()) if score 90: print(优秀) elif score 80: print(良好) elif score 60: print(及格) else: print(不及格)这段代码和下面这段对比一下你就明白什么叫顺序决定了逻辑# 错误示范如果分数是95会先命中 score 60直接输出及格 score int(input()) if score 60: print(及格) elif score 80: print(良好) elif score 90: print(优秀)2.3 循环遍历类穷举和累加的思想循环是程序员的基本功一级题目不会让你写多复杂的循环但一定会考。考法通常是两类一类是固定次数的遍历比如输出1到100之间所有能被3整除的数另一类是不确定次数的循环比如一直输入数字直到输入0为止。固定次数用for不确定次数用while这个选择本身就是考点。# for循环遍历1到100 for i in range(1, 101): if i % 3 0: print(i)这里range(1, 101)的边界要特别注意很多人写range(1, 100)结果漏掉了100。记住一个口诀range(a, b)包含a不包含b。while循环的经典场景是累加器比如输入多个数字直到输入负数为止计算所有正数的和total 0 while True: num int(input()) if num 0: break total num print(total)这里break的作用是跳出循环很多初学者会忘记在满足条件时跳出导致死循环。做这类题先在纸上把循环的退出条件想清楚再动手写代码。2.4 字符串与列表操作一级题里最容易被轻视的考点近几年的一级考试字符串和列表的题目比例明显上升。比如统计一个字符串中元音字母的个数将列表中的元素倒序输出去除字符串两端的空格。说实话这类题比循环分支要灵活得多因为方法太多了同一个功能有好几种实现方式。举个例子输入一个字符串判断它是否是回文正着读和反着读一样s input() if s s[::-1]: print(是回文) else: print(不是回文)我不知道你们看到这段代码什么感受我第一次教到字符串反转[::-1]的时候学生的反应基本是还能这样。Python的切片语法非常强大s[::-1]一步到位实现反转。但如果你不知道这个语法你可能会用循环逐个倒着拼代码长了三倍还不一定对。所以我的建议是字符串和列表的常用方法要整理成清单逐一去验证。比如字符串的strip()、split()、join()、replace()列表的append()、pop()、sort()、reverse()这些都是做题时最高频的工具。注意一级考试中代码能跑通是第一位的用最简洁优雅的写法是第二位。如果你对某个高级语法没把握就用最朴素的写法。阅卷主要看结果不是看谁的代码更花哨。3. 练习卷里那些看起来会了一写就错的陷阱这部分我专门讲坑。这些坑你不会踩的时候永远觉得别人小题大做等你踩了才发现每一条都是血泪教训。3.1 变量跨行使用与缩进带来的隐蔽错误我见过太多这样的代码for i in range(5): print(i) # 漏了缩进Python里缩进就是语法的一部分缩进错误直接报IndentationError这个还算好的至少报错你能发现。更麻烦的是逻辑上的缩进错误——代码不报错但执行结果不对。举个例子统计列表中大于0的元素个数nums [1, -2, 3, 0, 5] count 0 for n in nums: if n 0: count 1 print(count) # 缩进对了输出3但如果你不小心把print放进循环里nums [1, -2, 3, 0, 5] count 0 for n in nums: if n 0: count 1 print(count) # 这个print在循环体里会输出每次循环的结果这两种写法的区别极其隐蔽不运行代码根本看不出来。我建议做题时写完代码先在脑子里模拟一遍执行过程尤其是循环体里外到底是哪几行被重复执行了。3.2 比较运算里的链式比较和等于陷阱Python和其他语言不太一样它允许链式比较。比如0 x 10在Python里是合法的直接判断x是否在0到10之间。但很多初学着会把它写成0 x and 10这就直接语法错误了。正确的写法要么是0 x and x 10要么是0 x 10。还有一个经典陷阱是只写一个而在判断里用赋值if x 5: # 这是赋值不是判断会报语法错误在Python中是赋值才是比较。这个错误在考试时间紧张的时候特别容易犯敲键盘快了就顺手写出一个等号。建议平时练习的时候就养成习惯所有比较操作都先打两个等号再去补充两边的操作数。3.3 浮点数比较的玄学0.1 0.2 0.3这个表达式的结果是False你信吗在Python里确实是这样因为浮点数在计算机内部是二进制存储的有的小数无法被精确表示。但一级考试会考这个吗基本不会直接考这个知识点但可能会出现一道题让你判断某个浮点数累加的结果。比如x 0.0 for i in range(10): x 0.1 print(x)你以为输出是1.0吗实际输出是0.9999999999999999。如果你后面的代码是if x 1.0那就永远不成立。遇到这种情况正确的做法是比较它们的差值是不是足够小if abs(x - 1.0) 0.000001: print(相等)或者用Python的round()函数做四舍五入后再比较。这个知识点虽然考得少但一旦考到不知道的人会百思不得其解。3.4 读题不仔细忽略多组输入或边界条件编程题读题比写代码更重要这句话说一百遍都不为过。练习卷里经常有这样的题输入若干个整数以0结尾输出其中的最大值。很多同学上来就只读一个数然后直接输出完全没看到若干个这三个字。遇到这种题第一件事是确认输入有几个。一级里常见的模式有三种输入模式特征词应对方式单次输入输入一个整数直接input()固定个数输入n个整数for循环读n次未知个数输入若干个数以...结束while循环直到条件满足边界条件也是个大坑。比如输出100以内能被3整除的数就有同学从0开始而不是从1开始结果多输出了一个0。再比如共n行每行一个整数n是从题目给的输入里读出来的不是你自己定死的。考试时宁可多花30秒把题目重新读一遍也不要边写边在心里给题目加条件。4. 手把手推演两道高频考试题光讲方法论不够我带你们完整走一遍两道题的思考过程从读题到写代码到验证每一步都说明为什么这么做。4.1 题目一水费计算题目描述某市居民用水实行阶梯水价。每月用水量在20吨以内含20吨的部分按每吨3元收费超过20吨但不超过40吨的部分按每吨4元收费超过40吨的部分按每吨5元收费。编写程序输入用水量整数输出应缴水费。第一步整理条件。这是分段函数天然对应分支结构。根据题目用水量 20水费 用水量 × 320 用水量 40水费 20 × 3 (用水量 - 20) × 4用水量 40水费 20 × 3 20 × 4 (用水量 - 40) × 5注意第二段和第三段很多人会直接写成用水量×对应单价这是错的。因为阶梯水价的含义是每部分单价不同超过20吨的部分才按4元算前20吨仍然按3元算。这个理解直接影响公式正确与否。第二步写代码。分支顺序必须是从小到大water int(input()) if water 20: fee water * 3 elif water 40: fee 20 * 3 (water - 20) * 4 else: fee 20 * 3 20 * 4 (water - 40) * 5 print(fee)这里第二个条件我写的是water 40而不是water 20 and water 40。因为elif本身已经隐含了前面条件不成立的情况也就是说能走到elif这里肯定满足water 20了。少写一个条件代码更简洁还能减少出错概率。第三步验证边界。分别输入20、21、40、41四个数看看结果是否符合手算预期输入20if成立fee 60输入21第一个不成立第二个成立fee 20×3 1×4 64输入40fee 20×3 20×4 140输入41前两个都不成立走elsefee 60 80 1×5 145边界值非常重要。练题的时候我强烈建议每个条件分支的交界处各取一个数来测试因为这里是最容易算错的地方。4.2 题目二数字提取与求和题目描述输入一个字符串其中包含字母和数字如a1b2c3d4请提取出其中所有数字字符组成一个新的字符串并计算这些数字的各位数字之和。例如输入a1b2c3d4提取结果为1234各位数字之和为123410。第一步分解任务。这题涉及字符串遍历、判断、累加三个知识点。核心是遍历字符串的每一个字符判断它是不是数字。第二步写代码。s input() digits total 0 for ch in s: if ch.isdigit(): digits ch total int(ch) print(digits) print(total)这里面有两个关键点。第一isdigit()是字符串方法用来判断字符是否是数字字符返回布尔值。第二total int(ch)里的int()是必要的因为ch是字符类型不转换的话用会变成字符串拼接而不是数值累加。第三步考虑变体。如果题目改成提取所有数字字符并组成一个最大的数那做法就变了你可以把提取出来的数字字符排序后再拼接。如果改成数字之间用空格隔开输出那你可能在处理格式的时候需要加条件判断。这里我想强调的是做题不能只会做原题要会举一反三。练习卷的价值就在这——它逼着你掌握的是解决问题的综合能力而不是背下某一题的答案。下次看到类似的字符处理题你能想到用isdigit()、用int()转换、用累加器这道题的训练目的就达到了。5. 用练习卷做冲刺训练的三阶段方法练习卷拿到手不要直接从头做到尾那是浪费。我建议分三个阶段来用每个阶段目标不同效果也完全不同。5.1 阶段一分知识点专项突破拿到卷子先别急着整套做。先把卷子里的题按知识点分类比如输入输出专项3道题分支判断专项5道题循环专项4道题字符串列表专项4道题然后每天只攻克一个知识点。比如今天只做循环专项的4道题做完之后不急着做下一类而是把每道题的思路在脑子里过一遍它考察的是for还是while循环体里是什么操作退出条件是什么这样做的目的是建立题目→知识点的映射感下次看到类似的题你第一时间就能反应过来该用什么工具。5.2 阶段二限时整套模拟专项做完进入整套模拟阶段。这时候要严格限时一级考试的编程题部分一般给的时间是有限的你要模拟真实考试节奏。我建议整套卷子控制在规定时间的80%以内因为真正考试的时候你会紧张会卡壳留出缓冲时间。模拟的时候注意几点不许翻书、不许看笔记模拟考试就是模拟考试做完后先自己检查逻辑再对照答案错题不要改个答案就完事要重新在白纸上写一遍完整代码直到能一遍写对为止这个阶段最忌讳的是看答案觉得自己会了。你合上答案自己能不能从头到尾敲出来能不能做到编译通过、结果正确不能的话就还是不会。5.3 阶段三错题复盘与易错点整理最后这个阶段是拉开差距的地方。把整个练习卷做错的题、卡壳的题整理成一份个人易错清单格式可以很简单题目编号和题干关键词我的错误代码截取关键几行错误原因是语法不会、逻辑不清还是读题不仔细正确思路一句话总结我举个我自己的例子。前几年我一直会在range的边界上出错后来我在清单上写了一句range(1, n)不包含n要写range(1, n1)。这句话伴随了我很久每次写循环前都会默念一遍。整理易错清单的意义更多在于强制自己做一次复盘复盘本身比清单更重要。如果你能做到做完一张练习卷、整理出至少五条易错点并且下次做题前先看一遍清单那这张卷子的价值就翻倍了。6. 备考期间比刷题更重要的事很多同学刷题很勤快每天做几十道但效果一般。原因在于他们忽略了三个看不见的功课。6.1 动手敲而不是盯着看编程是门手艺活和学骑车、学游泳一样。你在岸上看再多的游泳教学视频不下水永远学不会。我也见过一些同学做题的方式非常省事——看题目看答案觉得哦原来如此然后下一道。这跟没做一样。至少做到每道题都在电脑上敲一遍运行一遍输入几组不同的测试数据验证一遍。这一步省不了。6.2 养成先写伪代码的习惯遇上稍微复杂一点的题我建议先写伪代码也就是用中文混合简单代码把逻辑框架搭出来。# 伪代码示例 s input() # 读入字符串 # 初始化统计变量 # 遍历每个字符 # 如果字符是数字 # 累加到总和 # 输出结果这样做的好处是把思考和编码两个过程分开。思考的时候不用纠结语法编码的时候不用纠结逻辑。很多人的问题就是一边想逻辑一边想语法两个任务抢大脑资源结果哪个都没做好。6.3 学会看报错信息初学者看到红色报错就慌其实报错信息是最好的老师。NameError告诉你变量没定义TypeError告诉你类型不对IndexError告诉你下标越界。每次报错先读第一行最后的异常类型然后看最下面一行的代码位置基本就能定位问题。我见过太多人报错了就直接删掉重写这是最浪费时间的方式。报错不是失败是程序在告诉你哪里有问题。你把它读懂了下次就不会再犯。7. 说说我用练习卷带学生的一些心得带了几届学生之后我对编程题练习卷这件事有了一些更深的体会或许对正在备考的人有参考价值。第一练习卷的难度设计是有讲究的。一份好的卷子应该有三个梯度基础题让你建立信心中等题让你巩固方法难题让你暴露问题。如果你做一张卷子发现全是会的说明卷子太简单对你没有提升如果全是不会的说明卷子太难反而打击信心。合适的卷子应该是独立完成60%看答案后理解30%剩下10%暂时放下、过几天再回头看。第二编程题练习最忌讳孤军奋战闭门造车。找个水平相当的同学互相批改代码、互相出题效果比一个人闷头刷好得多。你觉得自己写得很清楚的代码别人一眼就能看出问题你百思不得其解的报错别人可能三秒钟就找到原因。这种交流本身就是学习。第三不要迷信题海战术。一级考试的编程题类型就那么多种与其做一百道重复的题不如把十道有代表性的题吃透。什么叫吃透就是你能给别人讲明白这道题为什么这样解还能自己改编出两三道变体题。做到这个程度才算真正拿下了这类题。我自己一直跟学生说的一句话是编程题练习卷不是用来做完的是用来做明白的。你在这张卷子上暴露的每一个错误、卡住的每一分钟都是它送给你的礼物。把这些错误和卡顿转化为自己的经验考试的时候你就比那些刷题无数但从不复盘的人多了一份从容。最后再分享一个小技巧考试前一天不要做新题了把你整理的个人易错清单翻一遍然后在脑子里默写一遍几个核心语法点比如range边界、input返回字符串、条件分支顺序。这些小细节看着不起眼恰恰是考场上最让人后悔的地方。祝备考顺利。
返回列表