Python 首段可运行代码与 AI 协作入门学习笔记
代码不是写出来好看的,而是运行后能够验证的。Python 入门的第一段程序通常从
print()开始,但真正有价值的学习目标,是逐步形成“明确需求—编写代码—运行验证—处理边界”的完整闭环。
一、用 print 完成程序的第一次输出
print()是 Python 最常用的输出函数,可以输出字符串、数字、变量或多个值:
print("Hello, Python!") print(42) print(3.14) print("A", "B", "C")最后一行会输出A B C。当print()接收多个对象时,默认使用空格分隔,并在末尾换行。可以通过sep和end修改这两个行为:
print("A", "B", "C", sep="-", end="!") print("学习完成")输出结果为:
A-B-C!学习完成其中,sep控制多个值之间的分隔符,end控制一次输出结束时追加的字符。换行符\n、制表符\t也可以用于控制输出格式:
print("姓名\t年龄") print("第一行\n第二行")需要注意,带引号的内容是字符串,不带引号的名称通常会被解释为变量。若变量没有定义,print(hello)会触发NameError;如果只是想输出文字,应写成print("hello")。
二、理解常见报错
第一段代码出现错误很正常,重点是学会读取报错,而不是盲目修改。
| 报错 | 常见原因 | 排查方式 |
|---|---|---|
SyntaxError | 引号未闭合、括号不匹配、使用中文符号 | 检查报错行及其上一行 |
NameError | 使用了尚未定义的变量,或变量名拼错 | 检查赋值语句和名称拼写 |
TypeError | 对不兼容的数据类型执行操作 | 查看参与运算的数据类型 |
ZeroDivisionError | 除数为 0 | 运算前检查分母 |
FileNotFoundError | 指定文件不存在或路径错误 | 检查路径,并处理文件缺失情况 |
程序能够运行,只能说明语法基本可执行,并不能证明结果正确。因此应先预测输出,再运行并比较实际结果。
三、注释应该解释“为什么”
单行注释以#开头,适合说明业务规则、复杂公式来源或当前实现的限制:
# 会员订单享受九折,这是当前业务规则 final_price = original_price * 0.9像x = 5 # 给 x 赋值 5这样的注释只是重复代码,没有提供额外信息。变量名清晰时,应优先让代码本身表达含义。
三引号包裹的内容本质上是多行字符串;放在模块、函数或类的开头时,会成为文档字符串docstring,用于说明接口用途。它并不是 Python 专门的“多行注释”语法,因此普通代码说明仍建议使用#。
四、向 AI 下达精确指令
生成式工具并不能自动知道隐含需求。相比“帮我写个程序”,一条可执行、可验收的指令至少应包含五个要素:
任务目标:程序具体要完成什么;
输入:参数名称、类型和示例;
输出:返回值或打印内容及其格式;
约束:允许使用的库、边界规则和异常处理方式;
验收标准:给出明确的测试输入与预期结果。
例如,模糊指令“判断一个数是不是质数”可以改写为:
使用 Python 3.10 编写函数
is_prime(n)。输入为整数,输出为布尔值;小于 2 返回False,其余数字检查 2 到其平方根范围内是否存在因数,不使用第三方库。验收:is_prime(2)、is_prime(17)返回True,is_prime(9)返回False。
精确指令不仅能提高生成质量,也使结果具备客观的接收标准。如果需求没有明确非法输入如何处理,工具只能自行猜测,其实现很可能与真实意图不一致。
五、如何判断代码是好是坏
可以从四个维度检查一段代码:
可读性:函数和变量名称能否表达含义;
可预测性:相同输入是否稳定得到相同结果;
边界处理:是否考虑空输入、非法类型、零值和文件缺失;
实现适度:是否在简洁与清晰之间保持平衡。
下面的函数虽然不复杂,但名称、行为和验收用例都比较明确:
def count_positive(numbers): """返回列表中正数的数量;空列表返回 0。""" count = 0 for number in numbers: if number > 0: count += 1 return count assert count_positive([1, -2, 3, 0]) == 2 assert count_positive([]) == 0但它仍然隐含了“列表元素均为数字”的前提。如果输入包含None或字符串,比较操作会产生TypeError。究竟应该拒绝非法数据、转换数据还是跳过异常值,必须由需求规格决定。
六、AI 协作中的拒收意识
工具返回代码后,不应只看它是否简短,而要检查是否满足需求。例如:
print("结果:", 10 / 0)这段代码一定会发生除零错误,应在运算前检查分母,或者设计明确的异常处理逻辑。再如:
print(open("data.txt").read())它假设文件一定存在,并且没有使用上下文管理器。更可靠的实现需要使用with open(...),同时根据需求处理文件不存在和编码错误等情况。
代码的接收流程可以概括为:
对照任务目标检查功能是否完整;
对照输入和输出检查类型、格式;
使用正常值、边界值和异常值测试;
阅读变量名、注释和结构,判断是否便于维护;
修改问题后重新运行全部测试。
七、可复用的提示词模板
以后让 AI 辅助编程时,可以使用以下结构:
任务目标: 编程语言与版本: 输入(类型与示例): 输出(类型与示例): 约束(库、性能、异常处理等): 反例(明确不要做什么): 验收标准(测试用例):其中,“反例”能够进一步减少误解。例如判断闰年时,应明确不能只判断年份能否被 4 整除,因为能被 100 整除但不能被 400 整除的年份不是闰年。
总结
从第一段print()程序开始,需要建立的不只是语法记忆,更是一套可靠的编程习惯:理解输出参数和转义字符,学会从报错类型定位问题,用有价值的注释解释原因,把模糊想法转换成包含目标、输入、输出、约束和验收标准的指令,并通过边界测试决定代码能否接收。
AI 可以快速生成代码,但不能替代需求定义和结果责任。真正有效的协作不是“让工具把代码写完”,而是人给出清晰规格、审查实现,并用测试证明结果满足要求。
