1. 这不是“代码清单”,而是一张编程能力成长地图
你点开这篇标题,大概率正坐在电脑前,刚装好Python解释器,或者第一次打开VS Code,光标在空白编辑器里闪着,心里发虚:“到底该从哪一行开始敲?”——别急,我带过上百个零基础学员,从完全不懂变量是什么,到能独立开发微信小程序、自动化办公脚本、甚至接单做小型后台系统,整个过程里最常被问的问题不是“这个语法怎么写”,而是“我学了这些,到底能干什么?下一步该学什么?”
这篇标题里说的“100个代码”,根本不是让你死记硬背的代码片段合集。它是一套经过反复验证的能力进阶路径压缩包:把编程学习中必须跨越的100个认知关卡,全部具象成可运行、可调试、可修改的一行行真实代码。比如,“第7个代码”不是print("Hello World"),而是for i in range(3): print(f"第{i+1}次尝试,剩余{3-i-1}次机会")——它背后训练的是循环结构+字符串格式化+状态反馈意识三重能力;“第42个代码”不是抄一个排序函数,而是用5行代码手动实现冒泡排序,并在每轮交换后打印数组当前状态,让你亲眼看见“数据是怎么动起来的”。
它适合三类人:第一类是完全没碰过代码的纯新手,连终端命令行都怕输错;第二类是学过但总卡在“看懂了却写不出”的中间层,缺的是把知识焊接到肌肉记忆里的实操锚点;第三类是想转行做开发、但被网上碎片化教程绕晕的人——他们需要的不是“再学一遍if语句”,而是清楚知道“学完这10个代码,我就能自动整理1000个Excel表格;学完这30个,我能给老板写个日报生成器”。
我不会讲“编程有多重要”这种空话,也不会堆砌术语吓唬人。接下来你要看到的,是每个代码背后的真实场景、设计意图、常见变形、以及我带学员踩过的具体坑。所有代码都经过2023–2024年最新Python 3.11+环境实测,兼容Windows/macOS/Linux,不依赖任何付费工具或特殊库。现在,我们直接进入第一块基石。
2. 内容整体设计与思路拆解:为什么是这100个?为什么这样排?
2.1 不是按语法顺序,而是按“问题解决力”递进
市面上90%的入门教程,都是按语言特性编排:变量→数据类型→条件判断→循环→函数→类……这种结构看似逻辑清晰,但对新手极其不友好。原因很简单:人不是靠语法学会编程的,而是靠解决具体问题学会的。当你第一次面对一个Excel文件,需要把“销售部”和“技术部”的人员名单分开导出,你不会先想“我要用if还是elif”,你会本能地想:“怎么让电脑认出‘销售部’这三个字?”——这个需求,天然指向字符串匹配和条件筛选,而不是先啃完一整章“布尔逻辑”。
所以这100个代码,全部以真实工作流中的最小可交付任务为单位组织。前10个代码,全部围绕“让电脑替我做重复劳动”展开:
- 第1个:读取本地txt文件,统计其中“error”出现次数(解决日志排查)
- 第3个:批量重命名当前文件夹下所有jpg图片,按日期+序号规则(解决照片管理)
- 第8个:从网页源码中提取所有邮箱地址(解决信息收集)
它们共同特点是:单文件、无外部依赖、5行内可运行、结果肉眼可见。学员敲完第1个,立刻能在控制台看到“共发现7处error”;敲完第3个,文件夹里一堆照片名字就变了。这种即时正反馈,是坚持学下去的核心燃料。
2.2 每个代码都携带“三层信息”,远超表面功能
我设计每个代码时,强制嵌入三个不可见层:
- 表层:它能做什么(如“自动发送邮件”)
- 中层:它暴露了哪些关键概念(如SMTP协议、字符编码、异常捕获)
- 底层:它暗示了什么工程思维(如“邮件内容应与模板分离,而非硬编码在代码里”)
以第25个代码“自动生成周报PDF”为例:
from fpdf import FPDF pdf = FPDF() pdf.add_page() pdf.set_font("Arial", size=12) pdf.cell(200, 10, txt="【XX部门周报】2024年第23周", ln=True, align='C') pdf.output("weekly_report.pdf")表面看是PDF生成,但中层你必须理解:FPDF()实例代表一个文档对象,add_page()是状态变更,cell()是坐标定位——这其实在训练对象建模思维;底层则埋着提示:真正生产环境绝不会用FPDF,而会选reportlab或weasyprint,因为前者不支持中文换行。所以我在配套说明里明确写:“此代码仅用于建立PDF生成概念,实际项目请改用reportlab,原因见第67个代码的字体处理模块”。
2.3 严格规避“伪高级”陷阱,拒绝无效炫技
很多教程喜欢在入门阶段塞进“装饰器”“生成器”“协程”——这就像教人骑自行车,先让他背《空气动力学原理》。这100个代码里,所有涉及高阶概念的,都必须满足两个硬条件:
- 它解决的是零基础用户真实会遇到的痛点(如第89个代码用生成器处理10GB日志文件,避免内存爆掉)
- 它的实现可以被压缩到3行以内,且每行都有直观对应(如
yield行对应“我现在只处理这一行,不加载全部”)
没有一个代码是为了“显得厉害”而存在。第55个代码是“用正则表达式提取身份证号”,但它附带的注释是:“如果你只是要校验身份证号合法性,请直接用id-validator库,自己写正则易出错;但如果你想理解正则如何分组匹配,请重点看第3、第7个括号的含义”。——这种诚实,比堆砌100个花哨代码有用十倍。
3. 核心细节解析与实操要点:从“能跑”到“真懂”的关键跃迁
3.1 所有代码默认使用Python 3.11,但刻意保留向下兼容性
选择Python,不是因为它“最好”,而是因为它的语法最接近自然语言,错误提示最友好。但很多人不知道:Python版本差异对新手影响极大。比如Python 3.10新增的match-case语法,写起来很酷,但如果你用3.9环境运行,会直接报SyntaxError,而新手根本看不懂这个错误是什么意思。
所以这100个代码全部基于3.11编写,但做了三重保障:
- 所有
match-case结构都提供if-elif-else等效写法(如第33个代码的菜单选择) - 所有
f-string中的新特性(如=符号调试)都标注“仅3.11+可用”,并给出str.format()替代方案 - 所有第三方库调用,都注明最低兼容版本(如
requests>=2.25.0),并提供pip install requests==2.25.0降级命令
提示:安装Python时,务必去官网下载3.11.x版本,不要用Mac自带的2.7或某些Linux发行版预装的3.8。我见过太多学员卡在第一步,只因系统自带Python版本太老,导致
pip install报各种SSL错误。
3.2 每个代码都包含“可破坏性测试”设计
真正的掌握,不是“能抄出来”,而是“敢改坏它”。所以我给每个代码都预设了3个典型破坏点,比如第12个代码“计算BMI指数”:
height = float(input("请输入身高(米):")) weight = float(input("请输入体重(公斤):")) bmi = weight / (height ** 2) print(f"您的BMI是:{bmi:.1f}")它的破坏点设计是:
- 输入身高0米 → 触发
ZeroDivisionError,引出异常处理(第15个代码) - 输入身高“一米七五” → 触发
ValueError,引出输入校验(第18个代码) - 把
height ** 2改成height * 2→ 结果错误但不报错,引出单元测试概念(第41个代码)
这种设计让学员在安全环境中主动犯错,比被动听10遍“要注意异常”有效得多。
3.3 文件路径处理:新手崩溃率最高的隐形杀手
90%的新手在第5个代码就卡住,不是因为逻辑不会,而是因为路径写错了。比如第6个代码“读取同目录下的data.csv”,学员常写成:
# 错误示范(绝对路径硬编码) df = pd.read_csv("C:/Users/John/Desktop/project/data.csv") # 更错误(相对路径写错层级) df = pd.read_csv("../data.csv")正确做法是:
import os current_dir = os.path.dirname(os.path.abspath(__file__)) csv_path = os.path.join(current_dir, "data.csv") df = pd.read_csv(csv_path)但这对新手太难。所以我的方案是:所有涉及文件读写的代码,第一行强制添加路径诊断:
import os print("当前脚本位置:", os.path.abspath(__file__)) print("当前工作目录:", os.getcwd()) print("data.csv预期位置:", os.path.join(os.getcwd(), "data.csv")) # 然后才执行 pd.read_csv(...)学员运行后,一眼就能看出“哦,原来我的CSV文件不在这里,而在桌面”。这种把“看不见的路径问题”显性化,比教100遍os.path有用。
4. 实操过程与核心环节实现:以第17个代码“自动归档旧文件”为例
4.1 为什么选这个代码作为能力分水岭?
前16个代码主要训练“单点技能”:读文件、算数字、发邮件……而第17个是第一个要求多步骤协同的代码:它需要同时处理时间判断、文件移动、目录创建、错误回避。学员完成它,意味着正式跨过“能写简单脚本”和“能解决实际问题”的分界线。
它的原始需求来自一位行政同事的真实求助:“我每天要手动把上周的会议纪要移到‘已归档’文件夹,太耗时间。”——这就是所有好代码的起点:一个具体的人,一个具体的痛。
4.2 完整代码与逐行解析
# 第17个代码:自动归档7天前的.docx文件 import os import shutil from datetime import datetime, timedelta # 1. 定义工作目录和归档目录 work_dir = r"C:\meetings" # ← 这里必须替换成你的实际路径 archive_dir = os.path.join(work_dir, "已归档") # 2. 创建归档目录(如果不存在) os.makedirs(archive_dir, exist_ok=True) # 3. 计算7天前的日期阈值 cutoff_date = datetime.now() - timedelta(days=7) # 4. 遍历工作目录下所有文件 for filename in os.listdir(work_dir): if filename.endswith(".docx"): file_path = os.path.join(work_dir, filename) # 5. 获取文件最后修改时间 try: mtime = datetime.fromtimestamp(os.path.getmtime(file_path)) except OSError: continue # 跳过无法访问的文件(如正在被其他程序占用) # 6. 判断是否超过7天 if mtime < cutoff_date: # 7. 移动文件到归档目录 archive_path = os.path.join(archive_dir, filename) try: shutil.move(file_path, archive_path) print(f"✓ 已归档:{filename}(修改于{mtime.strftime('%Y-%m-%d')})") except PermissionError: print(f"✗ 权限不足,跳过:{filename}") except Exception as e: print(f"✗ 归档失败:{filename},错误:{e}") print("归档完成。")4.3 关键参数与决策依据
timedelta(days=7):为什么是7天?因为会议纪要通常按周归档,这是业务规则,不是技术随意定的。如果需求变成“归档30天前”,只需改days=30,逻辑完全复用。os.path.getmtime():为什么不选getctime()(创建时间)?因为Windows上文件复制后创建时间会变,但修改时间不变,更符合“内容未更新即为旧文件”的业务逻辑。shutil.move():为什么不用os.rename()?因为rename()在跨磁盘移动时会失败,而shutil.move()自动处理跨分区场景,这是生产环境必备鲁棒性。
4.4 实操现场记录:我带学员跑通时的真实过程
第一次运行,学员A报错:
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\meetings'原因:他没创建C:\meetings文件夹,也没改work_dir路径。解决方案:在代码开头加诊断:
if not os.path.exists(work_dir): print(f"错误:目录不存在,请先创建 {work_dir}") exit(1)第二次运行,学员B发现所有文件都被归档了,包括昨天新建的。查日志发现mtime获取的是0值——原来他用的是网络共享盘,os.path.getmtime()在某些SMB协议下返回异常。临时方案:改用os.path.getctime(),并在注释里写明“此处为兼容网络盘的权宜之计,长期方案见第88个代码的元数据统一接口”。
第三次运行,学员C成功,但归档后原文件夹里还剩一个空文件夹。追查发现他误把.docx文件拖进了子文件夹。解决方案:在遍历逻辑里加递归支持(第19个代码),但明确告知:“递归会增加复杂度,除非你确认需要,否则保持当前扁平结构更安全。”
5. 常见问题与排查技巧实录:新手必踩的5个坑及独家解法
5.1 坑1:中文乱码——不是编码问题,是编辑器设置问题
现象:代码里写了print("你好"),运行后显示??或æä½ 好。
90%的学员第一反应是百度“Python中文乱码”,然后疯狂改# -*- coding: utf-8 -*-、sys.setdefaultencoding('utf-8')……全错。
真相:Python 3默认就是UTF-8,乱码根源在编辑器保存编码和终端显示编码不一致。
独家解法(三步定位):
- 在VS Code右下角查看当前文件编码(通常显示“UTF-8”),如果不是,点击它→“通过编码重新打开”→选UTF-8
- 在Windows终端(CMD/PowerShell)输入
chcp,看输出是否为活动代码页: 65001(UTF-8)。如果不是,运行chcp 65001 - 如果用PyCharm,在
File→Settings→Editor→File Encodings里,把Global Encoding、Project Encoding、Default encoding for properties files全部设为UTF-8
注意:Mac/Linux用户基本不会遇到此问题,因为系统默认UTF-8。这个坑几乎100%锁定Windows新手。
5.2 坑2:ModuleNotFoundError——不是没装库,是装错环境
现象:pip install requests后,运行import requests仍报错。
学员常以为是网络问题,反复重装。
真相:你可能有多个Python环境(系统自带、Anaconda、pyenv管理的多个版本),pip装到了A环境,但VS Code默认运行的是B环境。
快速验证法:
import sys print("Python解释器路径:", sys.executable) print("当前Python版本:", sys.version)如果输出路径是C:\Users\John\anaconda3\python.exe,但你的pip是C:\Python311\Scripts\pip.exe,那必然失败。
终极解法:永远用解释器对应的pip:
# 查看当前解释器路径后,用它来调用pip C:\Users\John\anaconda3\python.exe -m pip install requests或者在VS Code里按Ctrl+Shift+P→输入“Python: Select Interpreter”,手动选中你pip install的那个环境。
5.3 坑3:IndentationError——不是空格/Tab混用,是缩进量不对
现象:明明看着对齐,却报IndentationError: unindent does not match any outer indentation level。
真相:Python要求缩进必须是4个空格的整数倍。如果你用2空格缩进,或Tab混用,或某行多打了1个空格,都会崩。
肉眼难查,用VS Code一键修复:
- 全选代码(
Ctrl+A) - 按
Shift+Alt+F(格式化文档) - 或右键→“格式化文档”
VS Code会自动把所有缩进标准化为4空格。
实操心得:在VS Code设置里搜索“insertSpaces”,确保勾选;搜索“tabSize”,设为4。从此告别缩进噩梦。
5.4 坑4:PermissionError——不是权限不够,是文件被占用
现象:移动/删除文件时报PermissionError: [WinError 32] 另一个程序正在使用此文件。
真相:文件正被Word、Excel、甚至资源管理器预览窗格占用。
三秒解决法:
- 关闭所有Office软件
- 在任务管理器(
Ctrl+Shift+Esc)→“详细信息”页签→结束所有explorer.exe进程(它会自动重启) - 重试代码
更彻底的方案(第72个代码):用psutil库检测文件占用进程并杀掉,但对新手建议先用人工法。
5.5 坑5:NameError——不是变量名写错,是作用域搞混
现象:函数里定义了result = 10,但在函数外print(result)报错。
真相:result是局部变量,函数执行完就销毁了。新手常误以为“只要代码里出现过,全局都能用”。
教学级解法:在代码顶部加全局变量声明(仅用于教学,非生产推荐):
result = None # 全局声明 def calculate(): global result # 显式声明要修改全局变量 result = 10 + 5 calculate() print(result) # 输出15但必须同步强调:“生产代码严禁滥用global,正确做法是让函数return结果,由调用方接收”。
6. 工具链配置与环境搭建:一套组合拳打穿所有安装障碍
6.1 编辑器选择:VS Code是唯一推荐,理由很现实
很多人纠结VS Code、PyCharm、Sublime哪个好。我的答案很直接:对新手,只有VS Code值得投入时间。原因有三:
- 免费且开源,无订阅压力(PyCharm专业版要$199/年)
- 插件生态最成熟,Python官方插件(Python Extension Pack)一键安装,自动配置调试、Linting、格式化
- 轻量,启动快,不像PyCharm打开一个项目要等半分钟
安装步骤(Windows为例):
- 去code.visualstudio.com下载安装包,务必勾选“Add to PATH”(这步漏掉,后续命令行调用会失败)
- 安装后打开,按
Ctrl+Shift+X打开扩展市场,搜“Python”,安装Microsoft官方插件 - 按
Ctrl+Shift+P→输入“Python: Select Interpreter”,选择你安装的Python 3.11
注意:不要装“Code Runner”这类快捷插件!它会掩盖真实执行流程,让新手分不清“运行”和“调试”的区别。坚持用VS Code原生的
F5调试,才能建立正确心智模型。
6.2 包管理:pip够用,但必须学会requirements.txt
新手常陷入“这个库装了,那个库又报错”的循环。根源在于缺乏依赖管理。
标准流程:
- 新建项目文件夹,进入终端,执行
pip install requests pandas - 立即生成依赖清单:
pip freeze > requirements.txt - 后续在其他机器部署时,只需
pip install -r requirements.txt
但新手常犯错:
pip freeze会导出所有全局库,包括你根本没用的wheel、setuptools- 正确做法是:用虚拟环境隔离
# 创建虚拟环境(Python 3.3+内置) python -m venv myproject_env # 激活(Windows) myproject_env\Scripts\activate.bat # 激活(Mac/Linux) source myproject_env/bin/activate # 此时pip install只影响当前环境 pip install requests pandas pip freeze > requirements.txtrequirements.txt内容会干净很多,只含真正依赖。
6.3 调试入门:别用print(),用断点才是正道
95%的新手调试方式:在可疑行前面加print("debug:", variable),运行,看输出,删掉,再加下一行……效率极低。
VS Code调试三步走:
- 在代码行号左侧灰色区域单击,出现红点即断点
- 按
F5启动调试(首次会提示选择环境,选Python File) - 程序停在断点,鼠标悬停变量名即可看值,按
F10单步跳过,F11单步进入函数
以第17个代码为例,在shutil.move()行设断点,运行后可实时看到file_path和archive_path的完整路径,比print()精准十倍。
7. 从“会写”到“能用”的最后一公里:如何把代码变成日常生产力
7.1 自动化不是终点,可维护性才是生命线
学员完成第100个代码后,常问我:“接下来学什么?”我的回答是:“回去重写前10个。”
因为第1个代码print("Hello World"),在学完第100个后,应该进化成:
# 改进版:带日志、带配置、带错误兜底 import logging from pathlib import Path # 配置日志 logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s") logger = logging.getLogger(__name__) # 从配置文件读取问候语 config_path = Path(__file__).parent / "config.json" if config_path.exists(): import json with open(config_path) as f: greeting = json.load(f).get("hello", "Hello World") else: greeting = "Hello World" try: print(greeting) logger.info("问候语已输出") except Exception as e: logger.error(f"输出失败:{e}")这不是炫技,而是告诉学员:所有代码最终都要面对三个现实:
- 需求会变(今天Hello World,明天要个性化问候)
- 环境会变(今天本地运行,明天要部署到服务器)
- 人会变(今天你写的,明天同事要维护)
所以第100个代码的真正意义,是让你亲手把“玩具代码”打磨成“可用工具”。
7.2 如何让老板/同事愿意用你的脚本?
我帮学员落地过23个自动化脚本,成功率最高的是那些把“运行方式”设计得比Excel还简单的。例如:
- 不要让用户打开终端输
python script.py,而是打包成双击运行的exe(用pyinstaller) - 不要让用户改代码里的路径,而是做成图形界面(用
tkinter,第95个代码) - 不要让用户记参数,而是用
argparse支持script.py --input data.xlsx --output report.pdf(第92个代码)
第99个代码就是“一键生成可执行文件”:
# 安装打包工具 pip install pyinstaller # 打包(生成单个exe,不带控制台窗口) pyinstaller --onefile --windowed --icon=app.ico main.py生成的dist/main.exe,发给同事,他双击就运行,完全不用知道Python是什么。
7.3 你的第一个“作品集”:3个代码撑起技术简历
当你说“我会Python”,招聘方不信。但当你说“我用Python写了3个工具,解决了XX问题”,HR会立刻给你面试机会。
推荐组合(全部来自这100个代码):
- 第17个(自动归档)+ 第45个(邮件通知):组成“会议纪要自动化流水线”,截图展示归档前后文件夹对比+收到的邮件通知
- 第63个(爬取天气)+ 第77个(生成图表):组成“本地天气日报”,用
matplotlib画温度曲线,导出PNG发到微信群 - 第89个(大文件处理)+ 第98个(进度条):组成“日志分析助手”,处理10GB Nginx日志,实时显示进度和Top10 IP
每个都配一张图:左边是代码核心片段,右边是运行效果截图。不需要多,3张图+100字说明,技术简历的“项目经验”栏就立住了。
8. 最后一点个人体会:编程不是学出来的,是“用”出来的
我带的第一个学员,是个42岁的会计。她学编程的唯一目标,是把每月要花3小时手工核对的银行流水,变成10秒自动完成。她学得很慢,第1个代码练了两天,print()都拼错两次。但她有个习惯:每学一个新知识点,立刻找一个自己工作中真实的、微小的痛点去套用。学了for循环,就试着把Excel里100行客户姓名批量加上“尊敬的”前缀;学了pandas,就马上拿上月的销售表练数据透视。
三个月后,她交给我一个脚本:自动从银行导出的CSV里,识别出所有“支付宝”交易,按商户名分组汇总,生成带公式的Excel报表,最后邮件发给财务经理。整个过程,她没背过一个算法,没写过一行“高大上”的代码,但她用这100个代码里的前30个,彻底消灭了一个重复劳动。
所以别焦虑“100个能不能学完”,盯着你手边那个最让你烦躁的、每周都要做的小事。打开编辑器,找到对应编号的代码,把它改造成你的专属工具。当第一次看到电脑替你做完那件事,屏幕亮起的那一刻,你就已经不是“学编程”的人了,而是“用编程解决问题”的人。
这个转变,不需要100个代码,可能只需要第1个。