你有没有过这种经历:Python 教程看了十来个视频,变量、循环、字符串每个名词都似懂非懂,关掉视频想自己写个程序,手放在键盘上却半天落不下去。我带零基础学员第一周时,从来不讲空泛的理论,只安排一件事——把 40 组完整的 Python 基础语法代码原样敲一遍,然后改一改、拆一拆、故意弄坏再修好。语法这东西,靠“看”是记不住的,得靠“敲”才能进脑子。这篇文章就是那一周的完整训练方案,覆盖 Python 基础语法里最高频的输入输出、字符串、条件分支、循环、列表、字典、函数、文件读写和异常处理,适合完全没写过代码、想快速跑通语法、又不想被理论劝退的人直接照着练。
1. 为什么要用“40组完整代码”入门,而不是看视频和背概念
1.1 语法不是学明白的,是敲明白的
我自己学 Python 的时候绕了不少弯路。当时喜欢囤教程、记笔记,把所有函数签名抄得整整齐齐,感觉特别充实。真到写脚本处理 Excel 时,第一行import之后就开始卡壳。后来我发现一个扎心的事实:编程能力的增长点不在“理解”上,而在“接触量”上。你每敲一行代码,手指和脑子之间就会多建立一条通路;你每改一个参数看到输出变化,语法规则才会从“书本知识”变成“身体记忆”。
所以这套训练里的 40 组代码,不是让读者当阅读材料看的,而是要一笔一画敲出来的。每一组都是一个“最小可运行单元”,跑起来能看到输出,报错时控制台会给出提示。这个设计参考的都是零基础学员最常见的卡点:不是不知道某个功能存在,而是不知道这段代码写出来长什么样、能产生什么结果。
1.2 这一周七天的节奏怎么安排
40 组听起来多,拆到 7 天里,每天其实只有 5-6 组。我的建议是每天抽 30-60 分钟,集中时间敲完一个阶段的代码,然后当天睡前再看一遍自己敲的内容,回忆每组代码解决什么问题。这样比周末一次性突击 7 小时效果好得多,因为语法积累需要“发酵”时间。
| 日期 | 练习范围 | 主题 | 知识点关键词 |
|---|---|---|---|
| 第1天 | 代码001-006 | 输出、变量、运算、输入、类型转换 | print、赋值、算术、input、int/float/str |
| 第2天 | 代码007-013 | 字符串操作 | format、upper/lower、find/replace、split/join、切片 |
| 第3天 | 代码014-019 | 条件判断 | if/elif/else、逻辑运算、三元表达式、猜数字 |
| 第4天 | 代码020-025 | 循环控制 | while、for、break/continue、九九乘法表、推导式 |
| 第5天 | 代码026-032 | 组合数据类型 | 列表、元组、字典、集合、类型互转 |
| 第6天 | 代码033-038 | 函数 | 定义、参数、返回值、作用域、lambda |
| 第7天 | 代码039-040 | 文件与异常 | open/with、try/except,以及综合复习 |
执行这周计划时,每敲完一组代码,建议顺手在代码后面加一个print()看看某个变量的值,或者把数字、字符串换掉观察变化。这个习惯从第一周开始养成,后面学复杂项目会受益很多。
2. 开跑前先配环境:版本、编辑器、PATH三个坑一次说清
2.1 Python 到底装哪个版本,装完怎么验证
直接去官网下载 Python 3.11 或 3.12,不要碰 2.x 的老古董,也不要选 Beta 测试版。安装时有一个全世界新手都容易踩的坑:安装向导第一页底部的Add Python to PATH复选框,一定要勾上。这个选项决定了你在命令行敲python时系统能不能找到它,不勾后面会多出一堆麻烦。
装完之后打开命令行(Windows 是 CMD 或 PowerShell,macOS/Linux 是终端),输入:
python --version如果看到类似Python 3.12.4的输出,环境就正常了。如果提示“python 不是内部或外部命令”“command not found”,大概率是刚才那个复选框没勾。解决办法很简单:重新运行安装包,选择 Modify,把 Add Python to PATH 勾上;或者手动把 Python 安装目录添加到系统环境变量的 Path 里,这一步网上一搜就有图解,不用慌。
2.2 编辑器三选一:IDLE、VS Code、Thonny
编辑器这块,我的建议反而和很多推荐不一样:第一周别急着上最花哨的工具,够用就行。
- 如果只想最省事,直接用安装包自带的IDLE。它长得很朴素,但能写能跑,报错信息完整,足够完成前 40 组代码。
- 如果愿意多花 10 分钟配置,用VS Code体验会更好。装完 Python 扩展后,它自带智能提示、代码高亮、单文件运行按钮,比较符合以后实际工作的环境。
- Thonny是专门给教学场景设计的编辑器,变量内存可视化做得很好,适合一点概念都没有的新手。
我不建议第一周直接上 PyCharm。不是它不好,而是完整版的索引、配置项对刚接触编程的人是个干扰项。第一周的核心目标是把代码敲熟,编辑器能高亮、能运行就够了。
2.3 第一天最容易卡住的“命令不存在”问题
有个情境我见得太多了:学员装完 Python,打开 IDLE 敲了第一行print("Hello"),一切顺利。第二天想用命令行运行脚本,打开 CMD 输入python 文件名.py,结果被系统提示“不是内部或外部命令”。这就是 PATH 没配好。
另外提醒一句:如果你的电脑上同时装了 Microsoft Store 里的 Python 和官网的 Python,命令行里可能会启动某个“未知版本”。遇到这种情况,先运行where python看路径列表,把不需要的版本卸载掉,只留一个,避免混乱。
3. 40组代码全清单:题目、覆盖知识点、运行注意点
3.1 第1-6组:输出、变量、输入与类型转换
前 6 组代码是整个 Python 世界的“第一块积木”:怎么把内容显示到屏幕上,怎么把数据存进变量,怎么做算术运算,怎么让程序接收用户输入。这里的核心目标不是学 API,而是建立“程序是逐行执行的”这个基本直觉。
| 编号 | 代码主题 | 核心知识点 | 最需要注意的点 |
|---|---|---|---|
| 001 | 你好Python | print() | 括号里的引号不能丢 |
| 002 | 变量与赋值 | 变量名规则、= | 变量名不能以数字开头 |
| 003 | 数字四则运算 | + - * / // % ** | /得出浮点数,//才是整除 |
| 004 | 字符串拼接 | +、* | 数字和字符串不能直接拼接 |
| 005 | 输入年龄 | input() | 接收到的永远是字符串 |
| 006 | 类型转换 | int()、float()、str() | 输入后要运算必须先转数字 |
重点提示:第 005 组会把很多人绕晕。input()返回的是字符串,假如你输入 18,得到的其实是"18",不是数字 18。想拿它做加法、比较大小,必须先转成int或float。这是后面所有类型 Bug 的源头。
3.2 第7-13组:字符串的常用操作
字符串在 Python 里是高频数据类型,日常写脚本处理日志、清洗数据几乎绕不开它。这 7 组代码聚焦字符串的格式化、大小写、查找替换、分割合并和切片,学完以后基本能应付大多数文本处理场景。
| 编号 | 代码主题 | 核心知识点 | 最需要注意的点 |
|---|---|---|---|
| 007 | f-string 格式化 | f"{变量}" | f 前缀后的大括号里才能放变量 |
| 008 | 大小写转换 | upper()、lower()、strip() | 这些方法不会改原字符串 |
| 009 | 查找与替换 | find()、replace() | find()找不到返回 -1 |
| 010 | 分割与合并 | split()、join() | split的结果是列表 |
| 011 | 字符串切片 | s[开始:结束:步长] | 切片左闭右开,不包含结束位 |
| 012 | 遍历字符串 | for ch in s | 字符串可以直接被循环 |
| 013 | 内容判断 | isdigit()、endswith() | 常用于输入校验和文件名校验 |
重点提示:008 组的upper()、lower()这类方法不是“就地修改”,而是“返回一个新字符串”。如果你只写name.upper()而不接收返回值,原字符串不会有任何变化。这是新手最容易忽略的小细节。
3.3 第14-19组:条件判断的四种写法
从第 14 组开始,程序不再是一条直线跑到底,而是会根据条件走不同分支。条件判断是程序逻辑的骨架,这 6 组覆盖单分支、双分支、多分支、嵌套、逻辑运算和三元表达式,按顺序写完,一个小的“猜数字游戏”就能实现了。
| 编号 | 代码主题 | 核心知识点 | 最需要注意的点 |
|---|---|---|---|
| 014 | 单分支判断 | if | if 下面的语句必须缩进 |
| 015 | 双分支判断 | if...else | else 后面没有条件 |
| 016 | BMI计算器 | if-elif-else | 多个分支只会命中一个 |
| 017 | 成绩等级 | 区间判断 | 判断顺序会影响结果 |
| 018 | 猜数字 | and、or、not | 逻辑运算优先级 |
| 019 | 三元表达式 | 值 if 条件 else 值 | 适合简单判断,别写太复杂 |
重点提示:017 组写成绩等级时,我经常看到有人把区间顺序写反。比如先判断>= 60输出“及格”,再判断>= 90输出“优秀”,结果 95 分永远输出“及格”。原因就是第一个条件已经命中,后面的分支不会再执行了。写多分支时,顺序要有逻辑,一般从大范围到小范围,或者反过来。
3.4 第20-25组:循环、推导式、九九乘法表
循环是让程序自动化处理重复工作的核心机制。第 20-25 组的目标是让人熟练使用while和for,理解循环控制语句break、continue的作用,同时通过九九乘法表练习双重循环,再用列表推导式感受 Python 的简洁风格。
| 编号 | 代码主题 | 核心知识点 | 最需要注意的点 |
|---|---|---|---|
| 020 | while累加 | while循环 | 必须有终止条件,否则死循环 |
| 021 | for与range | for i in range(n) | range 不包含终点值 |
| 022 | 跳过程序 | break、continue | break 结束整个循环,continue 跳过本次 |
| 023 | 九九乘法表 | 双重循环 | 内层循环范围随外层变化 |
| 024 | 列表推导式 | [x for x in...] | 推导式的语法顺序 |
| 025 | 带索引遍历 | enumerate() | 同时拿索引和元素 |
重点提示:020 组写while时,最容易出现的情况是忘记在循环体里更新条件变量,一运行程序就直接卡死。真遇到这种情况,在 VS Code 或 IDLE 里按 Ctrl+C 可以中断运行,不用砸电脑。另外 024 组的列表推导式看着很高级,其实语法顺序就是“先写输出表达式,再写循环,最后写筛选条件”。
3.5 第26-32组:列表、元组、字典、集合
这 7 组代码进入组合数据类型部分。列表和字典是以后写脚本使用最频繁的两种容器,元组和集合则各有特定用途。第 26-32 组不追求讲得多深,关键是搞清楚它们的基本操作和适用场景,并掌握多种类型之间的转换。
| 编号 | 代码主题 | 核心知识点 | 最需要注意的点 |
|---|---|---|---|
| 026 | 列表索引与切片 | list[i]、list[a:b] | 越界会报 IndexError |
| 027 | 列表增删改 | append()、insert()、remove()、pop() | remove 按值删,pop 按下标删 |
| 028 | 元组与解包 | tuple、a, b = b, a | 元组定义后可修改会报错 |
| 029 | 字典创建访问 | dict[key] | 键不存在会报 KeyError |
| 030 | 字典遍历 | items()、keys()、values() | 遍历字典默认只拿键 |
| 031 | 集合作运算 | 去重、交集、并集 | 集合无序且元素不重复 |
| 032 | 类型互转 | list()、tuple()、set()、dict() | 字典转列表本质转的是键 |
重点提示:029 组里,访问字典不存在的键时程序会直接崩溃。养成用d.get(key)的习惯,它在键不存在时返回None而不是报错,更适合做数据查找。第 031 组通过set()去重非常实用,比如从列表里筛出所有不重复元素,一行代码就搞定。
3.6 第33-38组:函数与作用域
函数是“把一段逻辑打包起来,重复使用”的工具。到这一阶段,代码从“流水账”变成“有结构的作品”。这 6 组覆盖了函数的定义、参数传递、默认值、返回值、多个返回值、作用域以及 lambda 匿名函数,足够支撑后续写小项目。
| 编号 | 代码主题 | 核心知识点 | 最需要注意的点 |
|---|---|---|---|
| 033 | 定义函数 | def 函数名(): | 函数体也要缩进 |
| 034 | 参数传递 | 位置参数、关键字参数 | 两种参数可以混用,但顺序有要求 |
| 035 | 默认参数 | def f(x=10) | 默认参数在定义时求值 |
| 036 | 多个返回值 | return a, b | 返回的是元组 |
| 037 | 变量作用域 | global | 函数内改全局变量需声明 |
| 038 | lambda表达式 | lambda x: x * 2 | 适合配合 sorted、map 使用 |
重点提示:037 组是很多教材会跳过但实际很重要的知识点。函数内部用=赋值时,默认会创建局部变量,不会改外部的同名变量。想在函数里修改全局变量,必须先写global 变量名,这是一个非常经典的面试题,第一周就能接触到。
3.7 第39-40组:文件与异常
最后两组是“让程序落地的关键”。文件读写让数据可以持久化保存,异常处理让程序在遇到错误时不会瞬间崩溃,而是能给出友好提示。这两组代码学完,基础语法的大框架就完整了。
| 编号 | 代码主题 | 核心知识点 | 最需要注意的点 |
|---|---|---|---|
| 039 | 文件读写 | open()、with、read()、write() | 记得指定 encoding 和关闭文件 |
| 040 | 异常处理 | try/except/else/finally | 异常按类型捕获,别裸 except |
重点提示:039 组里,新手最容易犯的错是只写open()不写close()。用with open(...) as f:这种写法可以自动关闭文件,少掉很多隐患。另外读文本文件时最好指定encoding="utf-8",不然在中英文混排文件上可能碰到编码乱码的问题。
4. 逐行拆解8组关键代码:从会抄到会写
4.1 代码006:类型转换,很多人从这组开始懵
# 代码006:输入两个数字并计算它们的和 a = input("请输入第一个数:") b = input("请输入第二个数:") print("直接加的结果:", a + b) a_num = int(a) b_num = int(b) print("转换后加的结果:", a_num + b_num)运行一下你就会看到,直接加两个输入,得到的是"1218"而不是30。因为input()返回字符串,"12" + "18"在字符串里是拼接。int()把字符串变成整数之后,+才是真正的加法。这个“类型”概念,是新手从抄代码迈向写代码的第一道分水岭。
4.2 代码016:BMI计算器,把条件分支串成真实场景
# 代码016:BMI计算器 height = float(input("请输入身高(m):")) weight = float(input("请输入体重(kg):")) bmi = weight / (height ** 2) print("你的BMI是:", round(bmi, 2)) if bmi < 18.5: print("偏瘦") elif bmi < 24: print("正常") elif bmi < 28: print("偏胖") else: print("肥胖")这组代码把输入、类型转换、算术运算、多分支判断全部串起来了,是前 16 组的一个“综合小测验”。这里的elif序列展示了条件分支的“短路”特性:一旦命中某个条件,后面所有分支都不会再判断。这种链式写法在以后的规则判断里非常常见。
4.3 代码024:列表推导式,学完能看懂很多开源代码
# 代码024:1到10之间偶数的平方 even_squares = [x ** 2 for x in range(1, 11) if x % 2 == 0] print(even_squares)输出是[4, 16, 36, 64, 100]。列表推导式的读法是:先看for x in range(1, 11),这是循环;再看if x % 2 == 0,这是筛选条件;最后看最前面的x ** 2,这是要放进新列表的表达式。很多开源代码和教程会大量使用这种写法,第一次见到可能会愣住,拆开看其实就是“循环加筛选加生成”。
4.4 代码030:字典遍历,处理带名字的数据
# 代码030:遍历字典的键和值 student = {"name": "小明", "age": 18, "city": "上海"} for key, value in student.items(): print(key, "->", value).items()返回的是(键, 值)的元组对,可以直接用key, value两个变量接住,这是 Python 里很常见的解包操作。学完这组代码后,处理多组类似学生成绩、配置信息、物品库存等带名字的数据时,字典会是你最顺手的工具。
4.5 代码037:变量作用域,经典面试考点
# 代码037:在函数中修改全局变量 count = 10 def add_one(): global count count += 1 add_one() print(count)如果没有global count这一行,函数内部会创建局部变量count,外部的count不会改变。很多新手在这个点上百思不得其解,因为直觉上“函数里的代码应该能访问外面的变量”。访问可以,但赋值会触发局部变量规则。这个机制理解后,再看各类递归调用和闭包代码都会更轻松。
4.6 代码039-040:文件与异常,让程序变得像真正的软件
# 代码039:用 with 写文件再读回来 with open("notes.txt", "w", encoding="utf-8") as f: f.write("第一行\n") f.write("第二行\n") with open("notes.txt", "r", encoding="utf-8") as f: content = f.read() print(content)# 代码040:异常处理示例 def safe_div(a, b): try: result = a / b except ZeroDivisionError: print("除数不能为0") else: print("结果是", result) finally: print("计算结束") safe_div(10, 2) safe_div(10, 0)这两组代码的共同点是“考虑到了程序可能会出错”。文件可能不存在、编码可能不对、除数为零、用户输入非法,程序越健壮,就越需要这种容错机制。第一周不必把所有异常类型都背下来,只要理解try/except是给程序穿了一层防护甲就够了。
5. 第一周踩坑合集:缩进、input类型、列表引用三大坑
5.1 IndentationError:新手第一道坎
IndentationError: expected an indented block这个报错几乎每个初学者都会遇到。原因很直白:Python 用缩进表示代码块,if、for、while、def后面的下一行必须有缩进。解决方法是统一用 4 个空格做缩进,别混用 Tab 和空格,尤其是在不同编辑器之间切换的时候。VS Code 右下角可以设置当前文件的缩进方式,我会直接设成 Spaces: 4,一劳永逸。
5.2 “20” > “100” 为 True:类型转换的隐形炸弹
print("20" > "100") # True print(int("20") > int("100")) # False字符串比较是按字符逐个比的,"20"和"100"比,先比第一个字符"2"和"1",因为"2"大于"1",所以结果是True,这完全不是数学上的大小判断。上一周如果有人没做类型转换就直接拿 input 的结果比大小,很可能得到完全反直觉的输出。处理用户输入时,先想清楚“我手里的是字符串还是数字”,能避开一大半逻辑错误。
5.3 改一个变量,另一个跟着变:列表引用的坑
a = [1, 2, 3] b = a b.append(4) print(a) # [1, 2, 3, 4],a 也被改了b = a这句并没有复制列表,而是让b和a指向同一个列表对象。改b等于改a。想要真正的副本,用切片或copy()方法:
b = a.copy()这种“引用 vs 复制”的概念在第一周可以先记结论,等学到函数参数传递时会再次遇到。提前知道有这回事,遇到列表莫名其妙被改时起码有个排查方向。
6. 第7天自测:不看书把这几题写出来,就算过关
6.1 三道快速自测题
闭卷的情况下能独立写出这三道题,说明这一周的语法底子初步打牢了。
- 输入两个数字,输出较大的那个。
- 用循环计算 1 到 100 之间所有偶数的和。
- 写一个函数,接收一个字符串,返回其中大写字母的个数。
这三道题分别对应条件分支、循环、字符串遍历与函数。如果写不出来,回到对应编号的代码组,把代码抄两遍再试一遍。抄代码不丢人,丢人的是抄完不运行。
6.2 一个收尾小项目:给全家人的成绩统计
第 40 组代码学完后,可以用一个综合小项目收尾。这个项目把循环、列表、input、类型转换、max、min、sum 全部串起来:
# 综合练习:成绩统计 scores = [] while True: line = input("输入成绩,直接回车结束:") if line == "": break scores.append(float(line)) if scores: print("总人数:", len(scores)) print("平均分:", round(sum(scores) / len(scores), 2)) print("最高分:", max(scores)) print("最低分:", min(scores))这个程序虽然短,但是你自己能写出来和只能看懂之间有本质区别。第一周结束的标准不是“看懂了 40 组代码”,而是“离开代码也能把类似的小程序写出来”。
6.3 学完这一周,你已经能看懂哪些代码了
很多人学 Python 是冲着写爬虫、做自动化、处理 Excel 数据来的。第一周结束后,你已经能看懂网上那些“Python 爱心代码”里的循环结构,能理解猜数字游戏的随机数逻辑,也能读懂带判断和循环的多数入门脚本。后面的路,无非是在这个基础上叠加第三方库和更复杂的数据结构。
我带学员时感受最深的一点是:进步最快的人,往往不是最聪明的,而是每天老老实实把代码敲一遍、遇到报错不急着问、先自己读一遍报错信息的那个人。报错信息不是对你的惩罚,而是程序在告诉你它哪里不舒服。把第一周的 40 组代码按这个节奏走完,你会发现自己对“语法”这两个字的恐惧,已经消失了大半。