Python小屋编程题1-10详解:从基础语法到函数定义的入门训练
董富国老师的“Python小屋”在高校Python教学圈里是一套辨识度很高的训练体系编程题从001一路排到几百道难度按阶梯式增长。而这其中编程题1-10这十道恰好是整个体系最底层、也最容易被低估的一级台阶。很多人觉得前几题“太简单了不值得认真做”结果真到写稍微复杂一点的代码时又连输入输出格式都处理不明白。我这些年带过不少零基础入门的同学几乎都会在编程题1-10这个区间出现“能看懂语法但不会写程序”的断层。这套题真正练的不是某个高深技巧而是把“读题—拆解—翻译成代码—输出正确结果”这条基本功链路用十个最小场景反复打磨到形成肌肉记忆。如果你刚装好Python环境、能在编辑器里运行代码却还没有系统刷过题编程题1-10就是为你准备的。它不需要你提前学完一整本教材具备变量、print、基础数据类型的概念就足够动笔。这篇文章我会把这组题的设计思路、题型拆解、常见坑点和刷完之后的扩展路线一次讲清楚。1. 董富国老师Python小屋编程题1-10的整体设计与训练目标1.1 这组题在Python入门体系中处于什么位置编程题1-10的位置非常精准它出现在你刚具备最基本语法概念、但对代码还没有手感的时候。这个阶段最大的特点就是“看得懂写不出”。你可能知道print怎么用也算得清a b但给你一个完整的小题目比如“输入圆的半径输出面积”就不知道第一步该干什么了。编程题1-10解决的就是这个断层问题。它通过最简场景让你反复练习三个核心动作输入数据、处理数据、输出数据。这三个动作看似基础却是所有后续题目甚至真实项目的共同骨架。电商系统再复杂本质也是前端收集数据、后端处理数据、再把结果输出给用户数据分析项目再花哨本质也是读入数据、清洗计算、输出图表和报表。前三道题把“三段式”的思路种下去后面遇到任何题目都会自然而然地往这个框架里套。这组题的适用人群边界也需要说清楚。完全零基础、连缩进是什么都不懂的同学不建议直接上来刷题。最好先看一章基础教材或配套视频弄清楚变量、字符串、整数、print、缩进的用途再回到这套题来。否则第1题就可能卡住而这种卡顿往往不是能力问题只是背景知识缺得太多了。1.2 题目编排背后的教学节奏与单变量原则如果你把编程题1-10连续做下来能明显感受到题目编排的节奏感。最开始几道题只要求最简单的输入输出让你先获得“代码真的能跑”的正反馈随后引入算术运算和类型转换再往后进入条件分支、循环、列表、字符串切片最后落到函数定义。每一道新题几乎只增加一个生知识点不会在两道题之间同时引入多个新概念。这种“单变量引入”的设计对自学者是最友好的。因为编程语言的知识点高度耦合循环边界没搞懂后面的嵌套循环会崩input()返回字符串没记牢数值计算题会反复报错函数中return和print分不清封装阶段的题目就会看不懂。一个环节不透后面的所有内容都会连锁崩溃。前10题把最底层的这些关键节点一个一个拆开、磨透后面的几百题才能谈得上“效率”二字。另外你会注意到不同题目之间存在变式。同一个if-elif-else结构可能在第5题是数值范围判断在第6题变成闰年判断在第8题又变成列表遍历中的过滤条件。董老师把同一个语法知识点用多种题面包装这种做法不是重复劳动而是让抽象语法逐渐变成一种可迁移的解题模式。做完这套题后你再看到陌生题目时不会慌因为本质上你已经见过好几种“长得不一样、里子却相同”的题目了。1.3 董老师题目的风格与细节敏感度训练董老师习题一个很突出的风格是题面简短但对输出格式要求极细。比如“保留两位小数”“结果之间用空格分隔”“每组输出占一行”。这些要求看起来像形式主义实际却是真实项目里最硬性的约束。你本地写一个计算器随便print出来没人管可一旦要对接网页、生成报表、交付接口格式不对就是事故。刷编程题1-10的过程中培养对输出格式的敏感度比刷题本身更有价值。我见过不少人代码逻辑完全正确但因为多打了一个空格、多了一个换行在自动评测平台被判定为错误答案。这不是能力问题是态度和习惯问题而这套题恰好提供了低成本的纠正机会。还有一个容易被忽略的细节部分题目要求学生把功能封装成函数。这个要求在编程题1-10的尾部开始出现它的意图是培养“把逻辑容器化”的意识。一个程序不再是一大坨顺序执行的语句而是若干可命名、可复用的小功能块的组合。这个抽象层次的跨越是整个编程学习的第一个分水岭。越早适应这种“定义能力、按需调用”的思维方式后面学面向对象、学框架就越顺畅。2. 编程题1-10的题型拆解与参考代码实现2.1 输入输出与变量交换题第一个翻译过程第1题最常见的形式是“输出一句话”或“输出自己的名字”。表面上看这道题就是练个print但实际上它完整覆盖了最基本的三个动作在编辑器中写代码、保存为.py文件、通过终端或IDE运行文件。这三个动作不熟练后面的题都会卡在环境操作上。有些人把代码敲进某个临时输入框里然后奇怪为什么运行不了其实只是没有真正走一遍“代码落盘—解释执行”的标准流程。第2题基本绕不开“交换两个变量的值”。很多教材会直接给三元组解法但初学阶段我还是建议先掌握临时变量的写法a 3 b 5 temp a a b b temp print(a, b)这里真正值得讲透的是赋值的执行顺序右值先被求值再写入左变量。temp a的意思是先把a此刻的值拷贝进temp而不是建立什么“别名”关系。把这一步理解透后面学列表、字典时就不会把“引用”和“赋值”两种概念混为一谈。生活里的类比也很直观交换两杯饮料需要先拿一个空杯子把第一杯倒进去再把第二杯倒到第一个杯子里最后把空杯子里的饮料倒回第二个杯子。如果你已经学到一定阶段还可以对比Python的多元赋值写法a, b b, a这行代码初看很神奇本质是右侧先创建了一个元组再按顺序解包给左侧变量。两种写法各自对应不同的底层机制都值得知道。但从训练角度出发我强烈建议先把临时变量的思路写熟练再引入语法糖否则容易“知其然不知其所以然”。2.2 数值计算与类型转换题从字符串到数值的第一道坎第3、4题通常会进入真正的计算环节比如求圆的面积、求三角形面积、做单位换算或者把秒数转换成“时:分:秒”。这类题最经典的写法是import math r float(input(请输入圆的半径: )) area math.pi * r ** 2 print(面积为: {:.2f}.format(area))这里最大的坑就是input()返回字符串这件事。几乎每本Python教材都会提醒你这一点但“被提醒”和“真正记住”是两回事。我见过太多人第一次做数值计算题就报TypeError却完全不知道错在哪里。要我说这个错误只踩一次反而更好它会让你从肌肉层面记住“外部输入进来时必须先做类型转换”。需要强调的另一点是运算优先级。程序里r ** 2 * math.pi能被正确计算是因为幂运算符优先级高于乘法。但如果你写一个混合了取余、加减乘除的表达式没有括号的话可读性会迅速崩坏。我的习惯是一旦表达式超过两层运算就给关键部分补上括号让解释器和读代码的人都看得懂。未来的你不会记得当时怎么想的但一定能看懂括号表达的逻辑。在数值计算阶段还有几个常被考到的细节round()控制小数位、str()拼接输出、f{area:.2f}格式化、math库里的常用常量。这些不难但都是高频使用的工具做题时顺手多试几种写法比到时候再查资料高效得多。2.3 条件分支题布尔逻辑的组织能力第5题开始加入条件判断最常见的形式是奇偶判断和闰年判断。闰年判断之所以能成为全国通用的教学题目是因为它把“带括号的复合布尔表达式”这个考点藏得非常自然year int(input(请输入年份: )) if (year % 4 0 and year % 100 ! 0) or (year % 400 0): print(year, 年是闰年) else: print(year, 年不是闰年)这个题真正要体会的是现实规则通常不是一句“如果”能表达清楚的。你要学会用and、or、not把规则拆解成计算机能识别的一组条件。很多人刚学时会把“能被4整除”误写成year // 4 0其实整除结果和取余结果是完全不同的语义。这个错误很典型它说明你还没对除法运算的两种不同含义形成直觉。分支覆盖问题也值得单独说。if后面是条件成立的路径else后面是条件不成立的路径两者最好保持对称。如果你在if里做了一些处理却没有在else里安排任何动作程序就可能出现“某种条件下什么都不输出”的怪现象。在小题目里这种问题不明显但一旦放到真实项目就会变成极难复现的偶发bug。做题阶段就把“每个分支都想清楚”当成默认习惯后面会少掉很多排查痛苦。2.4 循环与累加累乘题边界与状态变量第6、7题大概率进入循环控制典型形态是1到n的累加、n的阶乘、或者在若干输入中找最大值。累加题的标准写法n int(input(请输入n: )) total 0 for i in range(1, n 1): total i print(1到n的和为:, total)循环题有三个知识点特别容易出问题。第一个是range的边界规则。range(1, n)生成的是1到n-1想要覆盖到n必须写range(1, n 1)。这种“左闭右开”的设计是Python入门阶段的一大杀手几乎每个初学者都会在这里踩一次。踩过之后你就再也不会忘记range的上限是要加一的。第二个是累加器的初始化位置。total 0必须放在循环外。如果写在for内部每一轮循环都会被重新清零最后你拿到的只是最后一个数的值而不是总和。我判断这类错误的方法是拿一张草稿纸手动把循环跑三遍把total每轮变化写下来很快就能看清它是不是被意外重置了。这个“手动模拟”技巧在后续很多算法调试里都用得上。第三个容易忽略的是循环变量的生命周期。for循环结束后循环变量i仍然保留最后的值。在有些题目里这个特征会被刻意利用在另一些情境里则会造成干扰。明白它你对代码执行过程的理解就能更接近真实运行时。嵌套循环的经典代表是九九乘法表。它真正的意义不在于记住表的样子而在于理解外层循环控制“行”、内层循环控制“列”for i in range(1, 10): for j in range(1, i 1): print(f{j}×{i}{i * j}, end\t) print()注意内层循环的range上限是i 1它随着外层变量变化。这就是嵌套循环的动态本质内层每次执行的范围可以依赖外层的当前状态。把这个想明白后面处理矩阵转置、批量文件、多层数据聚合时就不会慌。2.5 字符串、列表与函数的抽象跳跃编程题1-10的尾部通常会安排字符串或列表的初级操作比如反转字符串、判断回文、求列表最大最小值再把之前的算法改写成函数。典型代码def sum_n(n): total 0 for i in range(1, n 1): total i return total n int(input(请输入n: )) print(结果是, sum_n(n))字符串判断回文最常被人直接用切片一行解决s input(请输入字符串: ) if s s[::-1]: print(是回文) else: print(不是回文)s[::-1]表面看起来只是一个技巧背后却是切片语法中start、stop、step三个参数的方向性。我建议你在做题时多试试s[1:4]、s[::2]、s[::-2]这些变体亲眼看看每次输出发生了什么变化比死记硬背规则要牢靠得多。列表操作这一轮还有一个常见考点在一个列表中寻找最大或最小值。新手往往不知道先从nums[0]开始而是一上来就初始化max_val 0结果输入全是负数时结果就会出错。最简单的写法nums [3, 1, 4, 1, 5, 9, 2, 6] max_val nums[0] for num in nums[1:]: if num max_val: max_val num print(max_val)这个模式里隐藏着一种很重要的初始化思路——“用真实数据做初值”而不是“用想象的安全值做初值”。这一点在做统计、求极值、对比类题目时非常关键。函数阶段的核心是理解“定义”和“调用”的分离。很多新人的思维被“代码一行一行直接执行”的模型绑住不太适应“先定义一段能力之后按需使用”。一个很有效的练习是把前几题的核心逻辑逐个封装成函数再写一个主程序按顺序调用它们。代码结构从“面条式”变成“模块式”的瞬间你会明显感觉到编程的层次感上来了。还有一个高频踩坑点return和print的区别。return是把结果交还给调用者print只是在屏幕上输出。如果你在函数里只打印了结果却没有返回外部变量接到的是None一旦参与后续运算就会继续报错。学会用“返回值视角”看函数才算真正跨过了这一关。3. 刷题过程中的真实痛点与排查机制3.1 五种最常见的运行报错速查编程题1-10期间的运行报错翻来覆去就是那几个类型。我整理成速查表卡住的时候直接对照报错信息常见原因处理方式NameError变量名拼写不一致或未定义就使用统一变量名命名检查大小写TypeError不同类型数据参与运算如字符串乘整数之外的组合先做int()或float()转换ValueErrorint()或float()收到无法转换的字符串检查输入里是否有空格、中文、小数点IndentationError缩进数量不一致全选代码统一为4个空格或TabIndexError列表或字符串下标超出长度检查索引边界打印len()值确认报错本身不可怕可怕的是看到报错就慌。Python解释器通常把异常类型、原因和出错行号一并给出先读最后一行回溯信息再往上面翻代码能帮你省下大量乱猜的时间。把解释器当敌人而不是当工具是很多初学阶段最吃亏的心态。3.2 不报错但结果错逻辑偏差的定位思路比报错更隐蔽的是程序能运行但输出不是预期结果。这种情况往往意味着你的算法逻辑有某处偏差常见诱因有三个。第一边界条件写错。比如题目要求“不小于10”你写成num 10当输入恰为10时结果就悄无声息地偏离了。这类问题要靠边界值测试来抓把0、最小值、最大值、正好等于给定值这类情况逐一测一遍。第二输出格式与题面不一致。该用空格却用了逗号该换行却没换行肉眼看不出来自动评测却会直接判错。前10题阶段严格要求自己对齐题目格式后面用在线题库时才不会吃暗亏。第三语句位置放错。循环内外的语句没有分清或者if内外的代码错位这类问题靠肉眼很难发现。我最常用的排查手段是临时加几个print把中间变量的值逐行打印出来然后对照预期逻辑逐步收窄范围。排查结束后记得把临时print删掉这是职业习惯也能让你的最终代码保持干净。3.3 刷题阶段应该养成的三个习惯一道道题刷过去容易刷完就忘也容易。为了对抗遗忘我建议初学者刻意做三件事。第一每做完一道题在代码末尾用注释写一句话说明这题考了什么知识点。比如“# 本题考range左闭右开”或者“# 本题考列表切片方向”。这句话会让代码变成你的个性化笔记复习时扫一眼就能想起当时的卡点。第二不要硬扛超过四十分钟。入门题思考四十分钟还没思路说明中间某个知识点已经断了。此时最合理的做法是先看参考思路把逻辑搞懂然后关掉参考自己重新写一遍。独立重写才是学习真正发生的地方。抄一遍永远只能带来“我会了”的错觉。第三养成最小样例验证的习惯。不要一上来就拿最复杂的输入去测先用最简单的值比如0、1、空字符串看输出是否符合直觉。这个习惯在后续项目开发中的应用频率远远超出你的想象。3.4 会读题和会对齐比会写代码更早被考查很多人忽略了一个事实编程题的最难之处往往不在“写代码”而在“准确理解题面要求”。第1-10题虽然语法层次低但有些题面会故意描述得很绕比如“要求输出所有满足条件的整数每个值占一行按从小到大排列”这里面包含了条件、格式、排序三个隐含指令。我建议每做一题时先用纸笔把题面拆成三块输入是什么处理条件是什么输出格式是什么。哪怕只有一个输入、一个print也这样拆一道。这个习惯坚持十道题之后你读陌生题目的速度会明显变快。很多人到后面刷题变慢不是代码能力差而是漏读了条件里的某个限定词导致方案整体跑偏。编程题1-10刚好是培养这种“读题肌肉”的最小成本试炼场。4. 做完编程题1-10之后这条路应该怎么继续走4.1 用三个微型项目验证基本功编程题1-10做完并不意味着Python基础已经通关它只是建立起最基本的代码手感。想验证自己是不是真的理解了我建议你直接做三个微型项目。第一个项目成绩等级统计器。输入若干分数按90以上为优秀、60到89为良好、60以下为不及格等规则统计人数和占比。它会综合运用条件分支、循环、列表正好是前10题核心能力的总和。第二个项目命令行乘法表生成器。接收用户输入的行数动态输出对应范围的乘法表。它需要解决动态循环边界、格式化输出、输入合法性校验三个问题。第三个项目简易计算器。封装加减乘除四个函数加上主循环和退出条件。你会发现这个项目至少涉及参数传递、返回值、while循环、类型转换、异常处理五个知识点。这三个项目每个都能控制在50行以内。做完之后再进入新领域底气会完全不同。很多人一上来就冲爬虫结果被URL处理、页面编码、反爬机制轮番打击最后挫败感极强。爬虫不是不能学而是要在程序化思维稳定之后。4.2 从基础语法到数据方向一条不太会绕弯的路线从学习热度来看很多人在查“python基础语法”、“python定义函数”、“python数组切片”同时也会查“python数据分析”、“python量化交易策略代码”、“python画图横坐标太密集”。这些关键词反映的是同一个真实需求从基础编程走向真实项目。我的建议是按这个顺序推进先系统学列表、字典、元组等复合数据结构再学文件读写能处理txt和csv文件然后学异常处理让程序在意外输入下不直接崩溃需要时再进入NumPy、pandas、matplotlib这三件套最后落到具体业务比如报表自动化、数据可视化、简单接口对接。这个顺序每一步都建立在上一步之上。先学会从文件读入一批数据再用pandas处理最后用matplotlib绘图比零散地搜索“python画图横坐标太密集”要系统得多。至于“量化交易策略代码”这类词我的建议是保持敬畏。量化策略是统计学、回测工程和实盘风险控制的综合没有扎实的代码基础真金白银很快会让人怀疑人生。另外“python安装numpy库的方法”、“python安装sklearn库”也是很多人的拦路虎。其实只要确认Python版本打开命令行执行pip install numpy即可遇到权限问题就加--user。这个操作不值得害怕多试几遍就有肌肉记忆了。4.3 用复盘式刷题把每一道题变成长期资产最后分享一个很少被专门提到的刷题方法定期复盘。每完成10道题回头把之前的代码重新读一遍不运行只看结构和注释。如果看到某段代码突然不理解为什么要那么写别慌这说明你已经比当时进步了只是当初的思路还没形成体系。复盘不是重抄一遍而是边看边问自己三个问题这里能不能简化这个解法能不能迁移到其他题型如果让现在的我来写会有什么不同这三个问题想多了你会发现董老师这些题虽然各不相同但底层都在反复训练同一件事把一个问题拆成“输入、处理、输出”三段然后逐段表达清楚。把这个思维练成本能再去看网上各种热门的项目代码你会发现那些看似复杂的功能核心往往也只是循环、条件、函数、数据结构的组合。这时候编程题1-10带给你的就不再是十道题的答案而是拆解和阅读任何程序的基础能力。最后说点我自己的体会。我早期刷题时也觉得“交换两个变量的值”这种题目太乏味完全看不出价值。但后来写排序、写链表、写各种涉及位置置换的算法时当初那个临时变量的思路一遍遍被回锅我才明白那些看似简单的练习的真正分量。技术的迷人之处常常不在炫酷的框架而在于你回头看时发现早期最笨的方法打下的底子后来托住了所有复杂的东西。如果你正卡在编程题1-10中的某一道上别着急这一关恰恰是整个Python大楼的地基。