第 8 章 让 AI 辅助编程
文章目录
- [第 8 章 让 AI 辅助编程](#第 8 章 让 AI 辅助编程)
-
- [🌈 关于《AI 零基础 36 讲》](#🌈 关于《AI 零基础 36 讲》)
- [先让 AI 解释一段完整的小代码](#先让 AI 解释一段完整的小代码)
- 把自然语言需求缩成一次小改动
- 第一版修改留下了一个错误
- 修复要和预期行为一起决定
- 用测试覆盖正常输入和边界
- 依赖、安全和边界要单独看
- 初学者可以照着走的顺序
- 关键资料
AI 发来一段代码,不等于这段代码已经运行过。
回答里的"已经修复""测试通过"只能说明模型生成了这些文字。真正的证据来自你的电脑,文件要能保存,程序要能启动,测试命令要有输出,原有功能还得继续工作。对刚接触编程的人来说,这条分界很重要。
本章会走完一次小改动。我们先让 AI 解释一个只支持加减法的计算函数,再要求它加入乘除法。第一版修改会在除以零时失败,随后根据完整报错定位问题,补上检查并运行六个测试。示例使用 Python 3.12.2 和 Windows 11,代码只依赖 Python 标准库。
🌈 关于《AI 零基础 36 讲》
🧠 零基础也能开始学 AI
《AI 零基础 36 讲》是一套面向初学者的 AI 入门教程。课程从认识和使用 AI 开始,逐步学习
Python、数据处理、机器学习与深度学习,再进入大模型应用开发,最后完成个人知识库助手的综合实践。
📖 本篇是正式讲解文章
通过具体例子、原创图示和操作结果讲清概念。涉及编程的章节提供可运行代码,方便你边读边试。
🎯 读完以后,动手检验
建议按专栏顺序学习,并完成对应的课后训练,检查自己能否独立运用本章知识。
博客专栏:《AI 零基础 36 讲》

先让 AI 解释一段完整的小代码
刚开始学编程时,直接问"这段代码什么意思"容易得到一篇术语很多的说明。先把解释任务缩小,告诉模型你的水平,再要求它沿着一次实际运行说明数据怎样变化。
本章的原始程序保存在 calculator_before.py 中。
python
def calculate(left, operator, right):
if operator == "+":
return left + right
if operator == "-":
return left - right
raise ValueError("不支持的运算符")
if __name__ == "__main__":
print(calculate(8, "+", 2))
可以这样提问。
text
我是 Python 初学者。
请解释 calculate 函数的输入和输出,再按一次 calculate(8, "+", 2) 的运行顺序逐行说明。
遇到 if、return 和 raise 时解释它们在当前程序里做什么。
最后指出传入 "*" 会发生什么。
暂时不要改代码。
这样的解释有一条明确路线。数值 8、运算符加号和数值 2 进入函数,第一个条件成立,函数返回 10,后续分支不再执行。传入星号时,两个条件都不成立,程序执行 raise 并产生 ValueError。
逐行解释并不要求每个括号都讲一遍。解释应当说清输入从哪里进来,条件怎样选择分支,结果从哪里返回,错误在什么情况下出现。
把自然语言需求缩成一次小改动
现在想加入乘法和除法。只说"把计算器功能完善一下",模型可能顺手添加交互菜单、图形界面或第三方库。改动越大,初学者越难看出哪一行解决了当前问题。
更合适的任务可以写成下面这样。
text
请修改 examples/calculator_before.py。
目标
让 calculate 函数支持 "*" 和 "/"。
保留
函数名称和三个参数不变。
现有加法、减法和非法运算符行为不变。
限制
只使用 Python 标准库。
先给出最小修改,不增加输入菜单。
验收
calculate(8, "*", 2) 返回 16。
calculate(8, "/", 2) 返回 4。
说明除数为 0 时程序会怎样。
文件路径、保留项和验收样例都写清以后,模型比较容易只动需要动的地方。OpenAI 介绍内部使用 Codex 的资料时也建议把任务写得像一个范围明确的问题,提供相关文件、组件和上下文。
第一版修改留下了一个错误
教学中的第一版建议稿保存在 calculator_buggy.py 中。新增部分如下。
python
if operator == "*":
return left * right
if operator == "/":
return left / right
乘法与普通除法都能工作,除数为零的情况没有处理。先不要根据代码外观猜结果,直接运行。
powershell
G:\Python\python.exe calculator_buggy.py
本项目在示例目录中实际运行后得到下面的 traceback,进程退出码为 1。
text
Traceback (most recent call last):
File "...calculator_buggy.py", line 14, in <module>
print(calculate(8, "/", 0))
^^^^^^^^^^^^^^^^^^^^
File "...calculator_buggy.py", line 9, in calculate
return left / right
^^^^^^
ZeroDivisionError: division by zero
完整的原始记录保存在 error-sample.txt 中。Python 官方教程说明,异常信息最后一行会给出发生了什么,前面的 traceback 列出程序经过的位置。本例最后一行是 ZeroDivisionError,向上看可以找到第 9 行的除法表达式,以及第 14 行传入零的调用。
只把"division by zero"发给 AI,信息太少。调试提示应同时提供环境、运行命令、完整报错、预期结果和最近改动。
text
运行环境
Windows 11
Python 3.12.2
没有第三方依赖
运行命令
G:\Python\python.exe calculator_buggy.py
预期
程序遇到除数 0 时给出清楚提示,不显示 traceback。
实际
粘贴完整 traceback
最近改动
刚为 calculate 函数加入 "*" 和 "/" 两个分支。
请先解释 traceback 中第 9 行和第 14 行的关系。
随后给出最小修复,并补一个能验证除零行为的测试。
不要修改现有加减法。
这类信息能让模型围绕已经出现的错误工作。运行环境不必写成长篇配置清单,先给解释器版本、操作系统、启动命令和依赖。涉及框架、数据库或浏览器时,再补相应版本与配置。
修复要和预期行为一起决定
发现除零以后,还要决定程序应该怎样响应。可以返回一段文本,也可以抛出一个更容易理解的异常。这个示例保留函数只负责计算的结构,在除数为零时抛出 ValueError。
最终版本保存在 calculator_after.py 中。
python
if operator == "/":
if right == 0:
raise ValueError("除数不能为 0")
return left / right
这里先检查 right。数值为零时,函数用清楚的消息停止;其他数值继续做除法。修改范围只有除法分支,已有加减法和非法运算符处理没有改动。
程序主入口调用 calculate(8, "/", 2)。实际运行结果如下,退出码为 0。
text
4.0
这个结果只证明普通除法能运行。加减法是否被碰坏,乘法是否正确,除零是否按约定处理,还要分别检查。
用测试覆盖正常输入和边界
本章的 test_calculator.py 使用 Python 标准库中的 unittest。Python 官方文档把测试用例描述为针对一组输入检查特定响应,并提供 assertEqual 与 assertRaises 等方法。
六个测试分别检查加法、减法、乘法、普通除法、除数为零和不支持的运算符。运行命令如下。
powershell
G:\Python\python.exe -m unittest -v test_calculator.py
项目中的实际运行结果为六项全部通过。
text
test_addition ... ok
test_division ... ok
test_division_by_zero ... ok
test_multiplication ... ok
test_subtraction ... ok
test_unsupported_operator ... ok
Ran 6 tests in 0.000s
OK
测试通过也有范围。这里检查的是几个明确输入,没有证明它能安全处理任意字符串、极大数字或外部文件。代码要放进真实项目时,还要根据输入来源和使用场景补充测试。

依赖、安全和边界要单独看
模型可能给出一个需要安装新包的方案。先查看 import 行和安装命令,确认包名、来源、版本与项目是否允许使用。一个十几行的小计算器没有理由为了四则运算增加第三方依赖。
运行陌生代码前,先读一遍它会碰什么。文件删除、批量改名、网络请求、数据库写入和系统命令都可能改变外部状态。把第一次运行放在测试目录或隔离环境中,准备好可恢复的数据。
代码里出现密码、访问令牌或私人数据时要停下来。不要把真实凭据贴给模型,也不要把模型生成的占位密码当成正式配置。涉及登录、权限、付款、文件上传和用户输入的代码,需要懂该系统的人做安全审查。
再看边界输入。本章的除数为零就是一项边界。空文本、负数、重复记录、超长输入和不存在的文件也常被漏掉。哪些边界值得测试,要由程序真实接收的数据决定,不能照着清单机械添加。
初学者可以照着走的顺序
- 保存原始文件,先亲自运行一次。
- 让 AI 解释输入、输出和一次具体调用的执行顺序。
- 把需求限制成一个小功能,写明哪些地方不能改。
- 让模型给出修改建议和验收样例。
- 阅读差异,检查依赖与可能改变外部状态的代码。
- 在自己的环境中运行,完整保留命令、输出和退出码。
- 出错时提供环境、复现步骤、完整 traceback 与预期结果。
- 修复后重跑原功能、当前功能和容易失败的边界。
- 只有人工审查与实际验证都通过,才把代码并入正式项目。
AI 可以解释陌生语法,也能很快写出一个候选修改。运行记录决定它有没有做成。下一章会从头安装 Python 和开发工具,把本章出现的解释器、终端与脚本文件放到同一套环境中。
