
寒假第10天我正式把Python四级备考的计划表翻到了“一级编程题专项”这一格。朋友看到我在刷一级的题第一反应是你要考的是四级回头做一级的题是不是有点倒退了我把自己前两周做四级真题时留下的批注翻出来指着上面一片一片的红圈说“这些卡壳点一半以上都死在最基础的读题、格式化输出、循环边界这种一级考点上。”所以这篇不是鸡汤是实际操作记录我用三天时间把一级编程题重新过了一遍题型怎么拆、题怎么做、哪些坑重新踩了一遍全部写在这里。1. 为什么四级冲刺前要先做一轮一级编程题1.1 四级的“新题”大多是一级骨架套了高级壳看四级考纲的时候注意力很容易被“递归”“lambda”“函数作用域”这些新名词吸走于是复习也跟着往难了刷。但我把近几套真题的编程大题逐行拆开以后发现一个标着“四级”的题目从头到尾真正写出来的时候高频语句永远都是这几样input()、int()、for i in range(...)、if...else、字符串切片、列表的append()、print()。四级的新知识点更像是贴在老骨架上的外挂骨架本身还是顺序、选择、循环这三座地基。拿一道典型的统计类题目举例给你一段文本统计某个单词出现的次数最后按指定格式输出。表面看考的是字符串方法、字典但如果你在一级阶段对“遍历字符串、拆分、计数”这套循环逻辑不够熟写出来的代码大概率又慢又容易出边界错误。我见过一个同学的解法光是在判断单词边界那里就绕了十几行而基础扎实的人用split()加循环五步就收工。这不是会不会用方法的问题是对循环模型有没有形成肌肉记忆的问题。所以我给这次寒假复习定的第一个原则是不跟风卷难题先把一级题目的底层模型打到“条件反射”级别。1.2 一级题的速度决定四级卷面的整体节奏四级这样的考试表面上是“会不会”实际上是“在有限时间内能做完多少”。编程大题不是只有一道前面还有大量客观题它们同样消耗时间。如果一道四级综合编程题里嵌套了一段一级难度的循环而你还得停下来想“range的右端到底是n还是n1”这一想就是两三分钟整张卷子的时间被切得稀碎。我给自己定了一个量化标准一级难度的编程题从读题到提交应该在5到8分钟内完成。这个标准不是拍脑袋定的。这类题的代码通常在15到30行之间读题一分钟构思一至两分钟写码两到三分钟自测一到两分钟属于正常节奏。如果你做一级题都要十五分钟以上说明不是题目难是基础动作不熟练。这时候去刷四级难题只是在低水平上重复建设。这三天我每天都掐表最后一天做10道混合题平均用时6分20秒比第一天的平均9分半明显快了一块。这个提速就是后面留给递归和算法调试的时间。1.3 机器判分不认“思路对”只认“输出对”还有一个初刷者容易忽视的事实这类等级考试的编程题判分靠运行结果说话对输出格式的要求极其严格。多打一个空格、用了中文逗号、print后面多一个换行、整数和字符串混着输出没转换这些全是直接扣分项。一级编程题恰恰是训练“输出纪律”成本最低的素材——场景简单你只需要关心“输入是什么、处理是什么、输出长什么样”不用被大逻辑干扰。把一级题练到闭着眼睛都能把输出格式写对进了四级的大题你才有力气去管复杂逻辑而不是一边想算法一边担心print写错。提示提交任何编程题之前先对着题目要求检查三点——变量类型是否转换、输出是否有多余空格或换行、中文全角符号是否混进了代码。这条说过一万遍考场上还是会有人栽。2. 一级编程题的高频题型地图先把考点摊开看一级编程题的范围看起来散实际上套路非常固定。我把手边的题册翻了翻归纳出下面五类高频题型按出现频率排序。题型典型问法核心知识点最容易丢分的地方输入输出与格式化读入若干个整数/字符串按指定格式输出input()、split()、int()、print()、f-string类型转换漏写、输出多空格循环累加与累乘求1到n的奇数和、阶乘、累乘for range、累加器/累乘器循环上界差一条件判断与数字拆解判断能否整除、统计某类数、分解各位数字%、//、if...else条件写反、忘记考虑相等情况字符串处理统计字符个数、反转字符串、截取子串遍历字符串、切片、len()下标越界、大小写判断漏下界turtle绘图画正多边形、填充颜色、连续图形forward、left/right、fillcolor、begin_fill角度算错、忘记闭合填充2.1 输入输出与格式化这类题通常不考算法考的就是你读题的仔细程度。常见场景读入一个整数计算后输出结果或者读入一行多个整数逐个处理后输出。核心是记住两件事input()返回的一定是字符串要用int()或split()处理print()默认在不同参数之间加空格如果题目要求连打或者逗号分隔要主动用sep或 f-string 控制格式。我见过有人输出结果时多写了一个空格整题判错非常可惜。2.2 循环累加与累乘这是最经典的编程题模型几乎每套卷子都有。核心结构就三种变体求和、求积、计数。求和就是total 0循环里total i累乘就是result 1循环里result * i计数就是count 0满足条件时count 1。很多四级里的统计题追到根上都是这三种变体的组合。2.3 条件判断与数字拆解“输出1到100之间能被3整除但不能被5整除的数”“判断一个数是不是水仙花数”——这种题需要你熟练使用%和//。数字拆解是另一个高频点把整数逐位拆开用% 10取个位用// 10去掉个位循环到原数变成0为止。这个操作在后面的回文数判断、数位求和里会反复出现值得专门练熟。2.4 字符串处理字符串遍历是一级编程题里最容易翻车的一块。基本套路是for ch in s:逐个处理字符或者用索引访问。字符判型这块我建议直接写区间比较判断大写字母写if A ch Z判断小写字母写if a ch z判断数字写if 0 ch 9。这样写比背官方字符编码值靠谱也不怕环境差异。2.5 turtle绘图turtle本身不难但它比较特殊图形化现场感强一跑起来就暴露方向感问题。一级阶段常考正多边形、填色、指定边长和颜色。本质上就一句话正n边形的外角等于360 / n画几边就循环几次forward(边长) left(外角)。填色顺序是fillcolor() - begin_fill() - 画图形 - end_fill()顺序不能乱。这部分我在第四节详细讲讲踩过的坑。3. 三道有代表性的题完整走一遍“读题—写码—自测”光列题型不够我把这三天里自己走过的完整过程挑三道写出来。每道题都按“读题拆解—写代码—测试验证”的顺序走这是我一贯练习的固定动作。3.1 循环求和主要死于边界题目输入一个正整数n计算1到n之间包含1和n所有不能被3整除的整数之和并输出。读题拆解三个关键词“1到n之间包含1和n” → 循环范围是range(1, n 1)不是range(1, n)“不能被3整除” → 条件是i % 3 ! 0“之和” → 累加器total初值为0。n int(input()) total 0 for i in range(1, n 1): if i % 3 ! 0: total i print(total)写完不能直接交要自测边界值。这道题最典型的边界陷阱是n本身能被3整除的情况如果n3正确结果是1加2等于3如果上界写成range(1, n)结果只有1直接判错。我自测时会固定跑三个值最小的合法值n1、让人迷糊的n3、和一个偏大的正常值比如n20。三个全对这题才算过。3.2 字符统计死于区间判断的下界题目输入一行由英文字母和数字组成、不含空格的字符串统计其中大写字母、小写字母、数字的出现次数按“大写 小写 数字”的顺序输出数字之间用空格隔开。这题考察的是逐字符遍历和分类计数代码长这样s input().strip() upper 0 lower 0 digit 0 for ch in s: if A ch Z: upper 1 elif a ch z: lower 1 elif 0 ch 9: digit 1 print(upper, lower, digit)我先说一个很多人写错的版本有人图省事把大写判断写成if ch Z觉得“只要比Z小就是大写”。但数字字符‘0’到‘9’的编码都比‘Z’小这种写法会把数字也统计进大写个数里。判断区间必须同时限定上下界少写一边统计结果就乱套。输出这里还有个细节print(upper, lower, digit)默认用空格隔开三个数字正好匹配题目要求的“空格隔开”。如果题目改成“逗号隔开”就要写成print(upper, lower, digit, sep,)。题目没看仔细在这类细节上丢分是最亏的。3.3 填色三角形死于角度与外角题目使用turtle库绘制一个边长为100的蓝色正三角形并填充颜色。import turtle t turtle.Turtle() t.fillcolor(blue) t.begin_fill() for _ in range(3): t.forward(100) t.left(120) t.end_fill() turtle.done()这题最大的坑是角度。画正n边形每次转向的角度是外角也就是360 / n。正三角形的外角是360 / 3 120度所以写left(120)。很多初学者套“三角形内角和180”的想法写成left(60)结果画出来的图形根本不闭合三条边首尾对不上。验证方法很简单看图形是否闭合。一个n边形画完方向应该回到起始方向所有转角加起来一定是360度。fillcolor要放在begin_fill之前填充才会生效。turtle.done()的作用是让绘图窗口保持打开方便本地观察效果如果考试系统有特殊要求按系统的文档来不调用也不一定错。我在本地练习时通常都会加上防止跑完代码窗口一闪而过。4. 刷题现场三天里我又踩进去的五个坑这次专项训练虽然是复习但我依然“稳定发挥”地踩了不少坑。把这些错题原样贴出来比讲十遍正确写法都有用。4.1 split( ) 遇上连续空格有一道题要读入一行多个整数我习惯性写了nums input().split( )心想按空格拆开总没错。结果自测的时候输入里有两个连续空格拆出来的列表里出现空字符串int()直接报错。根因是split( )会严格按单个空格拆多个空格会留下空串而split()不带参数时会按任意空白字符拆并把连续的空格、制表符合并处理。正确写法就是不带参数nums list(map(int, input().split()))这是个典型的老手翻车现场因为我平时写代码习惯性用split()但一到做题就莫名觉得“写清楚点更保险”反而写错了。这道题的教训是别人写过的标准写法都是有理由的别自作聪明。4.2 range上界永远差一“计算1到n之间所有偶数之和”我写成for i in range(1, n)。n8的时候算出来只有2、4、6三个数相加丢掉了8本身。这种错特别隐蔽因为n比较大的时候你很难一眼看出结果少了最后一项。自测必须用边界值覆盖n2时要检查2有没有被算进去n1时要检查循环是否正常执行。凡是出现“之间”“从几到几”这类描述的题把上界写出来之后先默念一遍“range右边到底开不开”再往下写代码。4.3 字符串列表直接当数字用有一题输出的是平均值保留两位小数。我读取数据后直接调了sum(nums) / len(nums)结果报错。检查才发现nums里的元素全是字符串‘1’加‘2’不是3而是‘12’字符串数组相邻元素相加会做字符串拼接。正确姿势是先map(int, ...)或者列表推导式转换nums [int(x) for x in input().split()]这个坑四级阶段还会反复出现尤其是处理文件读取出来的数据时。早一天养成“读进来的都是字符串”的肌肉记忆后面能省好多事。4.4 turtle图形超出画布被裁画正五边形的时候我没有移动起点直接从默认的坐标(0,0)开始画结果图形剩下的两边画到了画布外面窗口里看不全。原因很简单turtle默认朝向是向右从(0,0)出发如果边长很大或图形需要向上扩展很容易就跑出默认画布范围。解决方法是绘制前先t.up()把笔抬起来t.goto(x, y)把起点挪到安全位置再t.down()落笔开始画。数学上怎么确定起点坐标看一眼题目要求的图形尺寸和边长估出图形中心大致位置把起点放到中心偏下的地方一般不会裁。这个经验靠想象不靠谱多跑几次就有感觉了。4.5 中文标点混进输出有一题要求输出“结果是:5”题目里用的是英文冒号我不小心打成了中文全角冒号“”。本地跑的时候肉眼根本看不出区别机器判题直接判错。这个坑在所有等级考试里都出现过解法只有一个——写输出语句时不要照着题目的截图敲符号直接把题目描述里的冒号、逗号、括号原样复制到代码注释里写的时候对着注释敲。涉及符号永远怀疑自己用的是不是英文半角。这几天的错误我整理了一张表贴在电脑显示器边上每天开工前看一遍错误类型错误示例正确习惯拆分字符串input().split( )input().split()循环边界range(1, n)range(1, n 1)类型转换遗漏sum(nums)但 nums 是字符串列表先map(int)再计算绘图越界直接默认起点先up()、goto()、down()全角符号输出里的冒号是中文输出符号一律用英文半角5. 寒假一级专项的节奏设计三天的量怎么排5.1 三天一个循环的具体安排我给自己排的是三天一个循环每天两小时不贪多但每个小时都要有明确的产出。第一天做题型梳理。上午把上文的五类题型各做两道不求速度只求把每一类题的标准写法和边界测试跑熟。下午用半小时整理出属于自己的“题型模板表”——就是每个题型的固定代码骨架比如循环累加就是“初始化累加器→遍历→条件判断→输出”下次看到同类题直接套骨架。第二天做限时训练。选8到10道未做过的一级编程题每题限时15分钟到点写不完也先停下来去对照答案找卡点。这个环节重点不是刷题量是模拟考场的节奏感。你会发现真正写代码的时间占比很小大量时间都消耗在读题和瞎想上。把这两块压缩下来速度自然就上来了。第三天做错题重写和查漏。把前两天所有没有一次写对的题重新敲一遍这次不看任何参考答案从白纸开始。能顺利写出来说明真的吃透了写不出来就说明之前的“会”是记忆假象。最后再找一道四级综合题拆一拆里面用到了哪些一级模板检验一下迁移能力。5.2 用“讲题法”检验掌握程度我检验自己到底会不会一道题的方法特别土把代码放到一边自己对着手机录音讲一遍这道题的解题思路要求三句话以内讲清“输入是什么、用什么结构处理、输出什么”。如果讲的时候卡壳了或者需要回头偷看代码就说明这道题没有真正内化。这个办法比多刷十道题都管用。写代码的时候手会替脑子“圆场”——你隐约知道下一步该干什么但说不清为什么。能清晰讲出来的题才是真会。寒假在家没有同学可以互讲录音就是最好的替代方案。回放自己的录音还能顺带发现很多脑子里的模糊地带。5.3 一级套路如何平移进四级大题刷一级不是倒退而是在给四级搭脚手架。我在这次专项的最后一天特意把刷过的一级模板和四级真题做了个对照发现迁移路径非常清晰一级的题目模板在四级大题里的出现方式循环累加/计数列表或字典里按条件统计数据、求最值字符串遍历与切片文本清洗、单词拆分、子串匹配数字拆解%和//进制转换、数位求和、回文判断输入输出的格式控制多组数据按要求排版输出四级的新知识点是往这套骨骼上填肉骨骼不稳肉再多也会散架。我身边好几个四级备考的同学能把递归画图讲得头头是道但一写“把一行数字读进来求和”就翻车。这次寒假专项的意义就是把这层最容易被忽视的地基重新夯实一遍。三天下来我最直观的感受是写基础循环代码时不再需要“想”手自己就会动省下来的注意力全部用来处理四级真正的难点。这篇记录不是刷题炫耀是给同样在备考的朋友们提个醒——如果你做四级题也总在基础环节卡壳不妨回头把一级编程题用一个星期好好过一遍绝对比硬啃难题划算。