编程基础练习这件事,我做了快十年,带过不少新人,自己也经历过从“照着书抄代码”到“独立做项目”的全过程。说实话,现在网上的教程、课程、AI辅助工具多到看不完,反而把最该踏踏实实练的基本功给冲淡了。很多人一上来就问“我该学Python还是Java”“学多久能找工作”,但我见过太多人语言换了好几种、框架学了一大堆,最后连一个递归都写不利索,遇到报错第一反应不是读日志而是截个图到处问。这篇东西,我就围绕“编程基础练习到底练什么、怎么练”这个核心,把我自己的训练方法、踩过的坑、带新人时反复强调的点,完整写一遍。适合正在入门的人、带新人的老手,也适合那些“学了几个月还觉得自己不会编程”的迷茫朋友。内容不挑语言,Python、Java、C++都能用上,但示例我会偏Python一些,毕竟它更适合当训练场。
1. 编程基础练习的核心思路:不是“学编程”,是“练编程”
1.1 为什么基础练习比选语言、选框架更重要
我经常打一个比方:编程基础就像学开车时的方向盘和刹车。你开手动挡还是自动挡、开轿车还是SUV,那是后面的事;但如果方向盘都握不稳、刹车油门都分不清,换什么车都白搭。语言只是工具,基础才是能力。基础练习的本质,是让你的大脑建立一套“计算思维”——把复杂问题拆成小步骤、把重复动作抽象成函数、把状态变化梳理清楚、把边界条件想周全。这些能力不绑定任何具体语言,Python能做,Java能做,C++也能做,甚至你用伪代码练都能练出来。
我看到很多新人陷入“选择困难症”,今天看Python火学Python,明天看AI编程热门又去学Prompt Engineering,后天听说前端缺人又开始啃JavaScript。结果每个都学了点皮毛,遇到真正的编程问题依然无从下手。原因很简单:他们没有把“编程基础”当成一个需要刻意练习的独立科目。基础练习练的不是某个语言的语法,而是你在任何语言里都能用上的底层能力——变量与类型的直觉、流程控制的结构化思维、函数与抽象的拆分能力、数据结构的选择眼光、调试与排错的方法论。
1.2 基础练习到底在练什么:五个核心维度
我带新人时,会把编程基础练习拆成五个维度,每个维度对应不同的训练材料和方法:
- 语法与表达:熟悉一门语言的基本语法,能写出“符合语言习惯”的代码,而不是把A语言的写法硬搬到B语言里。这个维度靠“量”来堆,多写就熟了。
- 逻辑与控制:训练条件判断、循环、分支嵌套。这是程序“决策”能力的核心,难度在于把现实逻辑翻译成代码逻辑,并且保证所有分支都考虑周全。
- 数据与结构:掌握数组、列表、字典/哈希表、字符串处理等基础结构。很多“看似复杂”的问题,其实选对数据结构一下子就简单了。
- 函数与抽象:把重复代码抽成函数,理解参数传递、返回值、作用域。这是从“能跑”走向“可维护”的关键一步,也是很多人卡住的地方。
- 调试与排错:会读报错信息、会用断点或日志定位问题、能不靠“猜”来修bug。这是最容易被忽视、但实际工作中占比最高的能力。
你可以拿任何一个编程题库,把这五个维度当成“过滤器”,做题的时候问自己:这题主要练的是哪个维度?我哪类题错得最多?这样练习就不再是漫无目的地刷题,而是有针对性地补短板。
1.3 给不同基础的人的三条差异化路线
- 零基础:别急着上项目,先用2到3周把语法、流程控制、简单函数过一遍,配合每天5道“简单”难度的编程题,重点是“敲得出来、跑得通”。
- 学过但没练透:停掉新课,回头把练习题重新做一遍。如果一道题你能在10分钟内独立写出正确解法、还能讲清楚思路,才算过关。
- 有基础但想转方向:比如从Web转数据、从纯业务转嵌入式,基础练习的方式要调整为“目标语言/场景的定向强化”,用Python练逻辑、用C练内存、用SQL练集合思维,各有侧重。
这三条路我都见过走通的人,也见过走不通的。差别不在智商,而在有没有把基础练习当成一项“每天都要做、持续数周”的训练,而不是三天打鱼两天晒网。
2. 打通第一关:搭建编程环境,别让小问题劝退你
2.1 环境搭建的核心原则:最小可用、尽早开始
编程基础练习最大的拦路虎往往不是代码本身,而是环境问题。我见过太多新手在“装哪个编辑器”“配不配环境变量”“用不用虚拟环境”这些事上纠结一整天,最后连一句Hello World都没打出来,热情就凉了一半。我的建议是:对所有零基础的人,第一步只追求“最小可用环境”——能写代码、能运行、报错信息能看懂,这三条满足就够了。别去折腾复杂的IDE配置、插件美化、各种工程化工具,那些是后话。
以Python为例,最小可用环境只需要两步:装一个Python解释器(官网下载或系统包管理器都行),装一个趁手的编辑器。编辑器我推荐VS Code,免费、跨平台、插件生态好,但如果你是彻底的新手,甚至直接用IDLE或者记事本都行。关键在于“尽早跑起来”——你写的每一行代码,都应该立刻运行看到结果,这个反馈闭环越短,学习效率越高。
2.2 Python环境搭建的完整步骤(附避坑点)
我以Windows和macOS/Linux分别说一下,因为两个平台的坑不一样。
Windows平台:
- 去Python官网下载安装包,注意勾选“Add Python to PATH”(这一步不做,后面命令行会找不到python命令,很多新人就卡在这里)。
- 打开命令行,输入
python --version,能显示版本号就说明装好了。 - 装VS Code,装Python插件,然后在VS Code里打开一个文件夹,新建一个
hello.py,写print("hello"),按F5或点运行按钮。
macOS/Linux平台:
- macOS自带Python 3(新版系统),但版本可能较旧,建议用Homebrew装个新版:
brew install python。Linux的话直接用系统的包管理器,比如Ubuntu执行sudo apt install python3。 - 尽量用
python3命令而不是python,因为有些Linux发行版的python还指向Python 2。 - 如果遇到权限问题,不要随便用sudo改系统目录,建议学一下venv虚拟环境:
python3 -m venv myenv,然后激活它。
提示:Windows上如果
python命令没反应,可以试试py,Python安装器自带的这个启动器在某些场景下更好用。
2.3 从“环境能用”到“环境顺手”:三个必备配置
环境从“能用”到“顺手”,我建议做三件事,但每件都不要花超过十分钟:
- 第一个是VS Code里开启“自动保存”,省得每次写完代码还要手动Ctrl+S。
- 第二个是装一个代码格式化插件,Python用Black或autopep8,写完代码一键格式化,从一开始就养成规范的代码风格。
- 第三个是学会用调试功能,设置断点、单步执行、查看变量值。这一步很多人不会,但它是你后面排错最重要的工具。哪怕现在觉得用不上,也要知道“有这个功能”。
我还想多说一句:环境搭建这块,遇到问题很正常,但一定要学会“看报错”。命令行里红色的英文不是天书,它其实告诉你了问题出在哪。比如ModuleNotFoundError: No module named 'xxx',就是告诉你没装某个库,执行pip install xxx就行。新人如果能把报错信息当成线索而不是障碍,环境问题就解决了一半。
3. 基础练习的核心内容拆解:练什么、怎么练、练到什么程度
3.1 第一梯队:变量、类型、输入输出和简单运算
这是编程的“字母表”。你要搞清楚整数、浮点数、字符串、布尔值这几种基础类型,知道它们之间怎么转换,知道+在数字和字符串上分别是什么含义(一个是加法,一个是拼接)。你还要学会从键盘读入输入input()、向屏幕输出print()。这些内容单看起来简单,但它们是后续一切的地基。
练到什么程度算过关?我给你一个自测标准:写一个程序,读入两个整数,输出它们的和、差、积、商和余数。如果这个程序你能不看任何参考独立写出来,并且能解释为什么整数除法在Python里用//、为什么浮点数有精度问题,那一梯队就算过了。
这里我想特别讲一下“为什么整数除法用两个斜杠”。很多新手在这里很困惑,其实背后的原因是Python从设计上想让代码“更明确”。/是真正的除法,返回浮点数;//是向下取整的整数除法。为什么要区分?因为在实际编程里,“你要精确结果”和“你要去掉小数部分”是两种完全不同的需求。比如算平均分,你要精确到小数,用/;比如把一个列表按每10个一组分组、算第几页,你就用//。这一个小知识点,背后就是“根据场景选择正确工具”的编程思维。
3.2 第二梯队:条件判断与循环,程序的“大脑”
条件判断if/elif/else和循环for/while,是程序里最核心的控制结构。练这一块,我的核心建议是:多练“边界条件”。一个if什么时候走哪个分支,循环到哪个位置停,这些是bug重灾区。
举一个我常用的训练题:给定一个年份,判断它是不是闰年。规则是“能被4整除但不能被100整除,或者能被400整除”。这个题看起来简单,但是非常考验你对嵌套条件和逻辑运算符的理解。新手常见的错误就是只写了“能被4整除”这一个条件,漏掉了百年不闰、四百年再闰这两个特例。这类题目练的不仅是语法,更是“考虑周全”的思维方式。
循环的训练,我推荐的经典题是利用Python的range函数做求和、计数、找最大值/最小值。比如给定一个整数列表,找出其中所有能被3整除的数并求和。这道题用for n in numbers:遍历,用if n % 3 == 0:做筛选,用变量total做累加,覆盖了循环、条件、累加器三个基础能力。等你能熟练写这类题之后,可以进阶练“双重循环”——比如打印九九乘法表。这个题能让你理解内外层循环的执行顺序,是后面理解很多复杂算法的基础。
注意:循环里最容易出的问题就是“死循环”——条件永远为真,程序停不下来。如果不小心写了死循环,在Python里可以按Ctrl+C强制中断。这个经验很有用,哪天你写了一个
while True又忘了写退出条件,就不会慌到关机了。
3.3 第三梯队:字符串与列表,高频使用的数据结构
练习到这个阶段,你已经可以解决一些“有实际意义”的问题了,因为它们需要处理的数据不再是孤立的整数,而是成批的字符串和列表。
字符串处理的核心操作包括:切片s[1:3]、拼接、查找s.find("x")、替换s.replace("a", "b")、分割s.split(",")、判断大小写、去掉空白s.strip()。列表的核心操作包括:追加append、插入insert、删除remove/pop、切片、遍历、排序sort、求长度len。
我强烈建议你把这个阶段当成“背单词”来练——把每种操作的核心用法都写几遍,直到不需要查文档也能写出来。你知道为什么吗?因为很多真实需求其实就是“字符串+列表”的组合操作。比如你拿到一份CSV格式的文本,想提取其中某几列的数据,整个流程就是:split("\n")按行拆成列表,再split(",")按逗号拆分,再切片取需要的列。这套操作如果你练熟了,哪怕面对几千行数据都不怕。
练到什么样算过关?我给你一个综合题:给定一个英文字符串,统计其中每个字母出现的次数,忽略大小写,输出出现次数最多的3个字母。这道题用到字符串小写化、遍历、字典(或列表)计数、排序,还涉及“忽略大小写”这种细节处理,非常经典。你能独立做出来,说明第三梯队稳了。
3.4 第四梯队:函数与模块化,从“能跑”到“好用”
函数是基础练习里第一个“转折点”——练习它的意义不再是“解决某道题”,而是“写出更易读、易维护、易复用的代码”。我见过很多人的代码从一个极端走向另一个极端:要么所有逻辑全塞在main里,几百行下来自己都找不到哪段是干吗的;要么为了“看起来模块化”把三行代码也抽成一个函数,过度设计。
练习函数的正确目标,是形成“把一个重复出现的操作抽出来”的直觉。比如你连续三次写了“把用户输入转成整数,如果非法就重新输入”这段代码,这时候就应该把它抽成一个函数get_int(),以后到处调用。再比如题目要求先处理A再处理B再处理C,你就应该考虑把A、B、C分别封装成函数,主流程里只是依次调用它们。这就是“模块化”最简单的落地方式。
函数这块还有一个必须练透的知识点:作用域。简单说,函数内部定义的变量,函数外面访问不到;函数外面定义的全局变量,函数内部可以读但不建议直接改。新手经常在这里踩坑——在函数里想修改一个外部变量,结果发现函数跑完了值没变,就是因为没有搞清楚变量到底是新创建了一个,还是引用了外部的那个。解决这个问题的办法:要么用返回值把新值传出来,要么明确用global/nonlocal声明(但不建议滥用)。理解作用域,是你写复杂程序绕不过去的坎。
4. 从一道水仙花数开始:完整的实操案例拆解
4.1 题目理解:把“中文描述”翻译成“程序逻辑”
编程基础练习里最典型、也最考验“翻译”能力的,就是数字类题目。我拿“5位水仙花数”来完整拆解一遍——所谓5位水仙花数,是指一个5位数,它的每一位数字的五次方之和,恰好等于它本身。比如12345,要判断就是计算 1^5 + 2^5 + 3^5 + 4^5 + 5^5,看结果是不是等于12345。
这道题的价值在哪里?它同时覆盖了几个基础能力:循环遍历一个范围、把数字拆成每一位、计算幂、条件比较、收集结果。很多新手看到“每一位数字的五次方”就慌了,觉得“这怎么算啊”,其实核心就两步:第一步,把数字拆成单个数字;第二步,对每个数字做五次方然后累加。听起来很复杂的问题,一旦拆成两步,难度瞬间降下来了。
我们先写一个“判断单个数字是否为水仙花数”的辅助函数:
def is_armstrong(num): # 把数字转成字符串,再拆成单个字符,最后转回整数 digits = [int(ch) for ch in str(num)] # 计算每一位的五次方之和 total = sum(d ** 5 for d in digits) # 判断是否等于原数 return total == num这段代码用了列表推导式,看起来很Pythonic,但如果你还不太熟悉推导式,拆开写也行:
def is_armstrong(num): digits = [] for ch in str(num): digits.append(int(ch)) total = 0 for d in digits: total += d ** 5 return total == num两种写法功能完全一样,第一种更简洁,第二种更容易理解。基础练习阶段不必追求“逼格”,重要的是先写对,再慢慢优化。
4.2 完整代码:从辅助函数到主程序
接下来我们把完整的程序写出来。我们要在10000到99999之间找所有的5位水仙花数。这个范围就是所有5位数。
def is_armstrong(num): digits = [int(ch) for ch in str(num)] total = sum(d ** 5 for d in digits) return total == num results = [] for num in range(10000, 100000): if is_armstrong(num): results.append(num) print("5位水仙花数为:", results)运行这段代码,很快就会得到结果。我暂时不在这里公布答案,因为建议你先自己跑一遍。如果你的输出和预期不一样,正好借此练一下调试能力。
有读者可能会问:“为什么要用str(num)来拆分数字?我能不能用数学运算?”当然可以,用num // 10000num // 1000 % 10这样逐位取。两种思路都可以,但用字符串拆分更直观、不易错。在实际编程里,选择“能让自己逻辑清晰”的方式,往往比选择“看起来更高级”的方式更重要。
4.3 优化思路:把数学方法用到极致
基础练习不是刷完题就完了,真正的收获在于“做完之后还能怎么改进”。水仙花数这道题,如果你用数学方法做,可以省掉字符串转换的步骤:
def is_armstrong_math(num): total = 0 n = num while n > 0: d = n % 10 # 取出个位 total += d ** 5 n //= 10 # 去掉个位 return total == num这个版本的思路是:循环取余数、整除,不断从个位“剥”数字。它不需要字符串转换,不依赖语言对数字转字符串的实现,底层逻辑更通用。如果哪天你用C语言写,或者处理的是超大整数、不能简单转字符串的场景,这个数学版本就派上用场了。
我还想提一个“范围剪枝”的小优化:5位水仙花数其实有一个下界。一个5位数最大是99999,每一位最多是9,9^5=59049。如果某个数小于10000,它肯定不是5位数;但如果某位数的五次方之和小于某个下界,也可以提前退出。不过这个优化对于5位数来说几乎无所谓——总共才9万个数字,现代计算机瞬间就算完了。我在这里说这个,是为了让你形成一种意识:算法题讲究“能不能更快”,但实际项目里要先判断“值不值得更快”。练习的乐趣在于理解各种手段,做工程则要评估收益。
4.4 变形练习:一题三变,把基础吃透
做完5位水仙花数,我强烈建议你做三个变形题,把知识点吃透:
- 变形1:把“五次方”改成“六次方”,找6位水仙花数。你会不会?只要把
sum(d ** 5 ...)改成d ** 6,把范围改成range(100000, 1000000)就行。 - 变形2:写一个通用的函数
is_armstrong(num, power),让它可以判断任意位数、任意次方的“水仙花数”。这练的是“函数参数化”能力。 - 变形3:把范围改成从1到99999,找出所有满足“n等于其各位数字的立方和”的数(即3位以内的水仙花数),观察一下结果有什么规律。
这三个变形题,分别练的是“改一行代码”“抽象成通用函数”“理解题目本质”。做完这三步,一道水仙花数题才算真正吃透了。我带过的新人里,凡是认真做完变形练习的,后面遇到类似的“数字拆解类”题目,基本都能秒杀。
5. 从练习题到真实场景:基础能力怎么迁移到项目里
5.1 练习题和真实项目的差距在哪里
有些人在题库里刷了几百道题,自我感觉良好,一进项目组就懵了——代码几百行起跳、多个文件相互调用、数据处理带各种边界情况、跑起来还可能并发……这中间有个巨大的鸿沟。练习题往往是“给你明确输入、期待明确输出”的封闭问题,而真实项目是“需求模糊、约束多、出错路径千奇百怪”的开放问题。
但这不是说基础练习没用,而是你需要主动做“迁移训练”。怎么迁移?我归纳了三个关键词:数据、状态、边界。真实项目里,你手里的数据往往不是干净的整数、字符串,而是从文件、数据库、网络接口读进来的“脏数据”,可能是空的、格式错的、单位不统一的。真实项目里的程序也不是跑一遍就结束,而是长时间运行、不断接收新数据、需要维护内部状态。真实项目里的输入永远不会按参考答案来,用户可能给你传负数、传超长字符串、传缺失字段。
5.2 具体迁移案例:字符串处理在日志分析中的应用
我举一个我自己早期做过的例子,帮你理解练习题到真实场景的迁移。当时要写一个脚本,分析服务器的访问日志,统计每个IP地址的访问次数。日志里每行内容大概长这样:
192.168.1.1 - - [10/Oct/2023:13:55:36] "GET /index.html HTTP/1.1" 200 2326 192.168.1.2 - - [10/Oct/2023:13:55:37] "GET /favicon.ico HTTP/1.1" 404 209这个需求听起来很“工程化”,但拆解下来用到的全是基础练习里的东西:读文件(文件操作)、按行遍历、用字符串分割或正则表达式提取IP、用字典做计数、最后按计数排序输出。整个流程跟我前面提到的“统计字母出现次数”的练习题几乎一模一样,只不过把“字母”换成了“IP地址”,把“字符串处理”从键盘输入变成了“读文件”。
所以你看,真实项目不是另外一套知识体系,而是基础能力的排列组合。如果你在基础练习阶段就把字符串分割、列表遍历、字典计数练得滚瓜烂熟,那么遇到“统计每个商品被购买次数”“统计每个用户的登录次数”“统计每类错误出现的频率”,你都能一眼看到本质:都是同一道题换了个壳。
5.3 从语法到方向:基础扎实之后怎么选领域
基础练扎实之后,你会开始面对一个更实际的问题:往哪个方向深入?我结合自己接触过的领域,帮你把常见的几条路线和基础能力对应一下:
- 后端开发/API服务:核心基础是HTTP协议、数据库操作、并发处理。你会发现线程和进程的概念,其实就是“多个任务同时进行”的抽象;数据库的JOIN,本质就是“多个字典/列表之间建立关联”。
- 数据分析/数据科学:核心基础是数据处理、统计分析、可视化。你做的数据清洗工作,近八成都是字符串操作和列表变换;你写的统计分析,很多就是“分组-聚合-排序”这套组合拳。
- 嵌入式/底层开发:核心基础是C语言、指针、内存管理、对硬件的理解。这里更强调对“内存布局”和“位运算”的基础掌握,有一点像水仙花数题里“用取余和整除剥离数字”那种底层思维。
- 自动化运维/SRE(站点可靠性工程):核心基础是Shell脚本、Python自动化、Linux系统操作。大量工作是对文本和进程做操作,字符串处理能力极其重要。
- AI/机器学习方向:核心基础是Python、线性代数、统计概率。你写模型训练脚本,本质还是“数据清洗-特征工程-模型训练-结果评估”的流程,每一环都需要扎实的编程基础。
- 网络安全方向:核心基础是网络协议、操作系统、漏洞原理。需要你理解socket编程、抓包分析、字节流处理,这些更像是“字符串/字节操作”的高阶用法。
这些方向表面上差别很大,但底层都离不开那一套编程基础。所以我总是建议新人:方向可以晚点定,基础必须早点练。基础扎实了,转方向只是“换个语法熟悉几周”的事;基础不牢,换哪个方向都是空中楼阁。
5.4 编程规范:从基础练习开始培养的“肌肉记忆”
“大厂编程、测试、修bug都有哪些规范”这个话题在热搜里很火,说明越来越多的人意识到规范的重要性。但我告诉你一个扎心的现实:指望进了大厂再学规范,晚了。规范不是背出来的,是从一开始就养成习惯。基础练习阶段,你就应该注意下面这些事:
- 变量命名要有意义:
user_name比a好,total_price比tp好。写代码是写给未来的自己和其他人看的。 - 函数要做单一职责:一个函数只干一件事。如果函数名是“处理数据”,但里面又做了打印、又改了全局变量、又发了网络请求,说明它职责太多。
- 代码要有一定的格式:缩进统一、空格规范、空行分隔逻辑块。别小看这些,没人愿意读一团乱麻的代码。
- 写测试和调试:哪怕是练习代码,也可以顺手写几个断言
assert,验证自己的函数输出对不对。你在基础练习阶段练熟了这种验证习惯,将来写生产代码时会自然带上这个“抗体”。
说句实在话,代码规范看起来是“外在要求”,本质是“内在思维”的外显。一个能把基础练习题写得干干净净的人,进了项目组写代码也大概率是规规矩矩的。反过来,一个写练习题都乱糟糟的人,你很难指望他一进项目就突然变成规范大师。
6. 基础练习的常见问题与避坑技巧实录
6.1 语法都会,但一写题就卡住?问题出在“拆解”上
我带新人时最常听到的一句话是:“语法我都懂,但看到题目就不知道怎么下手。”这句话的本质,不是ta不懂语法,而是不具备“把题目拆解为多个小步骤”的能力。比如前面那道水仙花数题,如果新手看到题目就慌了,那是因为ta在心里把整道题当成一个无法攻克的整体;但如果把它拆成“拆数字”“算五次方和”“比较判断”“循环遍历”四步,每一步单独看都不难。所以我的建议是:拿到一道题,先不要想代码,先在纸上用中文或伪代码列出步骤,再翻译成代码。这个“先伪代码后代码”的习惯,绝大多数新手都没有,但它是解决“无从下手”最有效的方法。
6.2 报错看不懂?学会读报错信息是一种核心能力
“报错看不懂”是新手最大的拦路虎之一。我自己也经历过看见红字就焦虑、一报错就想删代码的阶段。后来我慢慢明白,报错信息其实是最好的老师,它在用非常精确的方式告诉你在哪里、发生了什么、怎么改。你要做的事情只有三件:
- 第一,看报错的第一行,找到“文件路径”和“行号”。大多数报错信息都会指出“第几行出错了”,这是你排查的第一个线索。
- 第二,看报错的最后一行,找到“错误类型”。比如
SyntaxError是语法错误,说明你有拼写或标点问题;TypeError是类型错误,可能你把数字和字符串做了运算;IndexError是索引越界,你访问了列表里不存在的元素;KeyError是字典键不存在。 - 第三,把报错信息的关键词复制到搜索引擎或AI工具里,如果有人遇到并解决过,大概率有现成的答案。
这一套流程熟练之后,你面对报错就不会慌。我甚至发现,一个人在基础练习阶段“敢不敢去读报错”,直接影响ta后面在真实项目里的表现——遇到bug就崩溃的人,很难胜任复杂的工程任务。
6.3 题库刷了几百题还是不会做项目?缺少“综合实战”
刷题刷了很多,但一到做项目就不会了,这个问题也很典型。原因在于,题库里的题大多是“单一知识点”的练习,而项目需要的是“多知识点综合运用”。补这个短板的方法,不是继续刷题,而是从第4周开始,每周末做一个“迷你小项目”,强制自己把这一周练的基础能力串联起来。
我给你几个练手的小项目,难度递增:
- 第1周:写一个“猜数字”游戏——程序随机生成一个1到100之间的整数,用户输入猜测,程序提示大了或小了,直到猜中。用到了随机数、循环、条件、输入输出。
- 第2周:写一个“简易记账本”——控制台输入“收入/支出/金额”和备注,程序把记录存在列表里,可以查看总数和余额。用到了列表、字典、循环、基本的数据存储。
- 第3周:写一个“文本分析器”——读入一篇英文文章,统计总字数、不同单词数、出现频率最高的词汇。用到了文件读取、字符串处理、字典计数、排序。
- 第4周:写一个“待办事项管理器”——支持添加、删除、标记完成、显示所有待办。用到了函数封装、列表操作、简单的数据持久化(存文件)。
这四个小项目做下来,你会明显感觉到自己从“会做练习题”进步到“能实现一个小工具”。这个进步靠刷题是刷不出来的,必须靠综合练习。
6.4 基础练习常见问题速查表
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
SyntaxError: invalid syntax | 漏了冒号、括号不匹配、中英文标点混用 | 检查报错指示行,重点看标点是否中英文不一致 |
NameError: name 'x' is not defined | 变量名拼写错误,或变量还没赋值就使用 | 检查所有变量拼写,确认变量在引用前已初始化 |
IndexError: list index out of range | 访问列表索引超出了范围 | 打印列表长度len(list),确认索引是否越界 |
TypeError: unsupported operand | 不同类型的数据做了运算 | 检查两侧数据是什么类型,必要时用str()、int()转换 |
FileNotFoundError | 打开的文件路径不对 | 确认文件名和路径是否写对,用os.getcwd()查看当前目录 |
| 程序运行结果不对但没报错 | 逻辑错误,某个条件或边界没考虑好 | 加几个print()看中间量,定位哪一步的结果不符合预期 |
这张表你可以收藏下来,遇到相应问题先对号入座,解决不了的再深入搜索。我真心建议所有初学者把这几个报错“混个脸熟”,因为你在基础练习阶段遇到的报错,90%都是这几种。
6.5 关于AI编程工具和搜索引擎的使用尺度
现在AI编程工具越来越强,很多新手问我:“既然AI能帮我写代码,我还有必要练基础吗?”我的回答很直接:AI是你的加速器,不是你的替代品;而基础练习,是你判断AI输出是否正确的前提。
我调查了身边不少同事和自己用AI写代码的体验,总结出几个原则:
- 原则一:AI可以用来“解释概念”和“帮你调试”。比如你不理解闭包是什么,让AI给你讲道理,讲完你动手写;你遇到bug百思不得其解,把报错信息发给AI让它给思路。这两种用法效率极高。
- 原则二:不要让AI直接帮你“做题”。如果你把练习题直接丢给AI让它生成答案,看似完成了任务,但你什么都没练到。等到面试、考试、实际项目里需要独立写代码时,你会暴露得非常彻底。
- 原则三:如果要用AI生成代码,务必做到“能读懂、能修改、能说明”。拿到AI生成的代码,你要能自己从头到尾讲清楚每一步在做什么,能根据新需求改它,能在它出错时定位问题。如果做不到,说明这个工具对你来说就是“借来的拐杖”,而不是你自己的腿。
说到底,AI编程工具再怎么强大,它们终归是运行在“理解输入、解决明确问题”的框架里的。未来会编程的人,不等于“会用AI的人”,而等于“能用AI解决自己提出来的具体问题的人”。你如果没有基础,连问题都描述不清楚,AI再强也帮不了你。
7. 给正在训练的你:一套可执行的分阶段练习计划
7.1 四周筑基计划:从环境到综合实战
我把自己当年带新人时验证过的训练计划放在这里,你照着执行就行。这个计划的核心是“每天1小时、持续4周”,量不算大,但贵在连续。
第1周:环境与语法。第1-2天装好Python和VS Code,熟悉编辑器操作;第3-5天练变量、类型、输入输出、条件判断;第6-7天练for/while循环,完成“打印九九乘法表”“猜数字游戏”。
第2周:数据结构与函数。第1-2天练字符串操作,第3-4天练列表和字典操作,第5天练函数定义和调用,第6-7天完成“简易记账本”小项目。
第3周:综合练习与调试。第1-4天每天做3-5道中等难度的练习题,重点练“拆解题目”的能力;第5天学习用断点调试;第6-7天完成“文本分析器”项目,顺便练文件操作。
第4周:项目实战与查漏补缺。第1-2天完成“待办事项管理器”;第3-5天复盘这四周做过的所有代码,把自己卡过的地方重新写一遍;第6-7天做一套自测题,包括水仙花数变体、字符串统计、简单排序等。做完这套题,如果你的正确率在80%以上,恭喜你,编程基础算是初步过关了。
7.2 每天练多久?什么时候可以加量?
你可能会问:“每天1小时够吗?我一天练3小时是不是更快?”我的经验是:初学者每天1到1.5小时刚刚好,重点在“连续不断”。因为编程是一项需要“大脑后台运行”的技能,你今天练的东西,睡一觉之后大脑会继续整理内化,第二天再练时你会发现理解得更透。如果连续3天不练,前面学的可能就凉了一半。所以“细水长流”远好过“三天打鱼两天晒网”。
什么时候可以加量?我的判断标准是:当你在练习中开始觉得“题目不够做”“想挑战更复杂的东西”时,说明你已经进入状态,可以增加时间或难度了。如果你还在为“完全看不懂”发愁,那就别贪多,把课本上的例题多敲几遍,比什么都强。
7.3 自测标准:怎么知道基础过关了?
最后给你一套自测标准,满足以下三条,我认为你的编程基础就算过关了:
- 第一,给你一道没见过的中等难度编程题,你能够在30分钟内独立写出可运行代码,并讲清自己的思路。注意关键词是“没见过的”“独立”——如果你只能做见过的题,说明还没掌握举一反三。
- 第二,给你一个包含几个文件的“迷你项目”(比如100行代码的程序),你能够读懂每一行在干什么,能够在指定位置添加新功能,能够定位并修好一个小bug。
- 第三,给你一段质量不佳的代码,你能够指出它的问题(命名不好、职责不清、冗余重复),并动手改造成更清晰的结构。
这三条不是考你对某个语言的记忆,而是考你真正的编程素养。达到这三条,你就有了“学习任何新语言、新框架”的底气。达不到,就继续回到基础练习里补。
我带过的人里,最快的一位用5周过了这三条,最慢的用了三个月。但他们都坚持下来了,最后也都顺利进入了真实的项目开发。所以别焦虑速度,踏踏实实每天练,基础这关谁也绕不过去,但谁都能走过去。