Python 开发基础:环境、金额与 AI 编程
今天从哪里开始
先看预习中的商品页:单价 129.00 元,买两件,页面应该显示 258.00 元。今天我带大家把这个手算结果变成能运行、能改、出了错也能找到原因的 Python 程序。
商品采用课程虚构资料:P1001 轻羽无线鼠标。今天做的是商城订单明细的本地金额核对工具;网页、库存和支付还没有接入。
先把电脑上的解释器和编辑器确认好,再把商品、单价与数量写成变量。等金额算对了,我们故意制造一个错误,最后让 AI 修改输出,用 Git 对比它到底改了什么。
我们今天把商城的哪一小块做出来
商品资料:编号、名称、单价 ──┐
├─ 单价 × 数量 ─→ 订单明细中的行金额
终端输入:数量文本 → 整数 ──┘在商城网页中,用户选择商品、填写数量;Python 后端根据商品资料计算金额。今天先把这条规则单独写成脚本,便于看清每一步。
| 今天遇到的问题 | 要学的办法 | 在商城哪里用 |
|---|---|---|
| 文件写了却跑不起来 | 解释器、终端、目录、PATH 和 venv | 启动金额脚本,后续启动商城服务 |
| 更换商品、数量后如何重算 | 变量、类型、赋值、顺序执行 | 商品编号、单价、购买数量和行金额 |
| 文本“2”怎么参与计算 | input、strip、int | 购买数量进入金额规则前的转换 |
| 钱怎么算、怎么让人核对 | Decimal、乘法、print 和 f-string | 订单明细的金额与元单位展示 |
| 出错了从哪里改 | Traceback 与最小修复 | 定位输入和计算错误 |
| AI 改标签时改坏了公式 | Git 快照、diff 和变化输入复验 | 保护已有金额规则 |
完成后,我们要用 2、3、1 和带空白的数量核对金额,换一件商品独立重算,修复一次名称错误,再审查一处 AI 修改。详细步骤见 今天的任务书。
一段 Python 代码在电脑里怎样跑起来
你在 TRAE 里点击“运行”,画面很快出现结果。中间其实经过了多层:电脑提供硬件,操作系统管理进程和文件,终端发出命令,Python 解释器读取源码,最后把输出或错误送回终端。
现场问答
.py文件只是文本,它会自己运行吗?- 电脑里装了两个 Python,输入
python时会用哪一个? - 文件明明存在,为什么还会报“找不到文件”?
先创建自己的项目文件夹,用TRAE打开,再在项目集成终端使用PowerShell,检查四项环境信息:
Get-Location
python --version
python -c "import sys; print(sys.executable)"
where.exe python四条命令各回答一个问题:
| 命令 | 它告诉你什么 |
|---|---|
Get-Location | 终端目前在哪个目录 |
python --version | 当前命令启动的 Python 版本 |
sys.executable | 真正运行代码的解释器文件 |
where.exe python | Windows 可能找到的 Python 路径 |
课程基线是 Python 3.12.x。python 找不到、跳转 Microsoft Store 或版本不对,都先保留原始输出,然后按下面的“检查并安装 Python 3.12 与 TRAE Code CN”处理。
电脑、操作系统、终端、Python 解释器和源码的关系
终端把命令交给操作系统查找,Python 解释器执行源码。先查是否安装、PATH(命令搜索路径)及当前解释器,安装或修改 PATH 后重开终端;TRAE 是编辑工具,不代替解释器。
运行方式补充:编译型语言和解释型语言
知道运行方式,是为了判断商城脚本修改后要重新运行什么。下面作为查阅补充,不要求今天掌握编译器原理。“编译型”和“解释型”描述的是源码怎样变成可执行行为。先看两条典型路径:
| 观察点 | 典型编译型语言 | 以 CPython 为例的 Python(解释型) |
|---|---|---|
| 启动前 | 编译器把源码编译、链接成可执行文件 | 启动 Python 解释器并读取 .py |
| 运行时 | 操作系统启动已生成的程序 | CPython 先生成字节码,再由 Python 虚拟机执行 |
| 修改后 | 通常重新编译再运行 | 通常直接重新启动脚本 |
| 常见例子 | C、C++、Rust、Go | Python;JavaScript 等语言也依赖具体运行时 |
这不是绝对分类。现代语言会混合字节码、虚拟机、即时编译等机制。课堂把 Python 称为解释型语言,是为了强调运行脚本时解释器始终参与;不能由此推出“Python 完全没有编译过程”。
Java常见路径是源码经javac编译成字节码,再由JVM运行;它不属于上表直接生成本机可执行文件的典型路径。是否手动点击编译,不是划分执行机制的依据。
为什么 AI 应用开发常用 Python
Python 语法紧凑,数据处理、Web(网页应用)、自动化和 AI 生态成熟,适合把业务想法快速做成可运行原型。它也有代价:类型和边界写得含糊时,程序可能运行到一半才暴露问题。
面试官如果追问“Python 适合 AI,所以什么都应该用 Python 吗”,可以这样回答:选型还要看性能、团队能力、运行环境和已有系统。今天选择 Python,是因为课程主线要同时练业务逻辑、Web 服务和 AI 应用交付。 企业中往往多种编程语言共用,不同的系统不同语言。
检查并安装 Python 3.12 与 TRAE Code CN
先沿着图从左到右判断自己在哪一步。已经能看到 3.12.x 的同学直接做复查;命令不存在的同学进入安装,不跳过,也不靠桌面图标猜测环境是否可用。
已经安装:确认版本和来源
python -V
where.exe python
python -c "import sys; print(sys.executable)"只要当前项目能明确使用 Python 3.12.x,就不需要卸载电脑里的其他版本。
没有安装:课堂上完成安装
- 打开 Python 3.12.10 官方发布页。
- 在 Files 中下载
Windows installer (64-bit)。不要下载源码压缩包、embeddable package 或 32 位安装包。 - 启动安装器,勾选
Add python.exe to PATH,再选择Install Now。 - 安装完成后关闭旧终端,并彻底退出再重开 TRAE。已经运行的程序不会自动获得新的环境变量。
- 在新终端重新运行:
python -V
py -3.12 -V
where.exe python
python -c "import sys; print(sys.executable); print('Python 可以运行')"
python -m pip --version至少要看到 Python 3.12.x、真实解释器路径和 pip 路径。
Python 安装界面参考
下面四张图用来帮助第一次安装的同学认出按钮和页面顺序。
注意:旧截图窗口标题中的
32-bit是历史画面,不是本课程的安装选择。当前课堂必须从官方发布页下载Windows installer (64-bit);截图只参考界面和勾选位置。
| 1. 起始页:确认 PATH(可执行程序搜索路径环境变量) 选项 | 2. 可选功能:保留 pip |
|---|---|
![]() | ![]() |
| 3. 安装位置与环境变量 | 4. 安装完成页 |
![]() | ![]() |
回答问题:PATH 选项是否勾选?安装以后是否在新终端完成了命令验证?安装完成页本身不能证明环境已经可用。
没有安装 TRAE Code CN:课堂上完成安装
- 打开 TRAE Code CN 官方下载页。
- 下载 Windows 版本,运行安装程序并按默认流程完成安装。
- 启动 TRAE Code CN,完成登录和初始设置,进入 IDE(集成开发环境) 模式。界面随版本更新可能变化,课堂以“能打开自己的项目目录和终端”为验收目标,不背按钮位置。
- 新建或打开你课程目录
w01-order-rules,确认左侧文件树显示的是自己的目录,不要在教师参考代码目录里直接修改。 - 打开 TRAE 集成终端,运行
Get-Location、python -V和git --version。如果 Python 是刚安装的,先彻底退出 TRAE 再重新打开,让新进程重新读取 PATH。
TRAE 能打开不等于 Python 环境通过;AI 能生成代码也不等于你会运行。今天必须把“编辑器可用、项目目录正确、解释器可运行”三件事分别验证。
环境变量怎样影响编程语言
环境变量是操作系统交给进程的一组配置。它们不改变 Python、Java 或 C++ 的语法,却会改变“启动哪个工具、到哪里找依赖、程序读取什么配置”。
| 环境变量或配置 | 对开发过程的影响 |
|---|---|
PATH | 终端按目录顺序寻找 python、java、node、git、编译器等命令 |
PYTHONPATH | 可以追加 Python 模块搜索目录;课程项目不靠手工修改它解决导入问题 |
| 项目环境变量 | 后续保存 API(应用程序接口) 地址、运行模式和密钥等配置,密钥不能进入 Git |
| 进程继承 | TRAE 和终端启动时读取当时的环境;安装或修改后通常要重开程序 |
观察当前 PATH 的前几项:
($env:PATH -split ';') | Select-Object -First 8
Get-Command python -All如果 where.exe python 返回多条路径,顺序靠前的通常先被命中。不要凭感觉反复重装,先用 sys.executable 确认本次到底启动了谁。
项目目录与 venv
今天从自己的目录开工:
w01-order-rules/
├─ contract/ # 当天业务规则与虚构数据
├─ labs/
│ └─ d01_language_lab.py # 语言实验
├─ src/
│ └─ order_rules.py # 今日项目
├─ checks/check_d01.py # 已提供的验收工具
└─ evidence/ # 本人运行与排错记录相对路径从“当前目录”开始解释。python src/order_rules.py 找不到文件时,先看 Get-Location,不要急着改 Python 代码。
venv 解决什么问题
优先明确使用课程版本创建虚拟环境:
py -3.12 -m venv .venv如果 py 不可用,但 python -V 已确认是 3.12.x,可以使用 python -m venv .venv。
在 TRAE 中把本项目解释器切换到 .venv 后,新开终端再检查:
python -c "import sys; print(sys.executable)"看到路径进入当前项目的 .venv,就说明切换成功。把 .venv/ 写入 .gitignore。今天没有第三方依赖,只观察隔离机制。若新终端未切换,可以直接运行 .\.venv\Scripts\python.exe src/order_rules.py,不必为激活虚拟环境修改系统脚本策略。依赖安装和跨环境重建会在后续继续。
接下来只使用今天需要的语法:先解释商品数据如何表达,再写金额计算。不需要提前翻完全部 Python 课件。
变量、赋值和命名
商城商品和数量经常变化,不能把答案固定写在输出里。我们用变量保存它们,再根据当前值计算。先看变量、赋值、引号和命名。from decimal import Decimal表示从标准库模块decimal(十进制数值类型)中导入Decimal,今天只学习这一种导入写法,不需要安装第三方包。Decimal("35.00")根据十进制字符串创建金额。
我先演示每行如何执行,再请大家预测修改数据后的结果:
from decimal import Decimal
demo_product_id = "P-DEMO"
demo_unit_price_yuan = Decimal("35.00")
demo_quantity = 3
demo_line_total_yuan = demo_unit_price_yuan * demo_quantityPython 按顺序执行本段语句,先计算赋值号右侧,再把结果交给左侧名称。# 后面的文字是注释,解释给人看,不参与金额计算。必须先有单价和数量,再算行金额;算完以后只改数量,不会让旧的行金额自动更新,要重新执行计算。
= 是赋值:让左边的名称指向右边算出的值。它不是数据库保存,也不是数学证明。
比较三种名称:
| 写法 | 读代码的人还缺什么信息 |
|---|---|
x = Decimal("129.00") | 不知道它是什么 |
price = Decimal("129.00") | 不知道单位 |
unit_price_yuan = Decimal("129.00") | 能读出业务含义和单位 |
企业代码首先写给下一位维护者看。AI 若把业务名称缩成 x、a、n,要问它:这样的命名,是否换来了更多误解?命名要见名知意
四种基础类型与 Decimal 金额
商城编号是文本、件数是整数、是否上架是真假值;金额使用 Decimal。类型决定可以怎样操作这些值。变量有了名字,接下来还要看它装的是什么。同样写着 129,文本、整数和十进制金额参与运算时会得到不同结果。
print(...) 把括号中的结果写到终端;type(...) 返回一个值的类型。这里先调用 Python 已有的工具,自己定义函数留到 D03。
| 类型 | 例子 | 商城中的用途 |
|---|---|---|
str 文本 | "P1001" | 商品编号,不拿来做金额乘法 |
int 整数 | 2 | 购买件数,尚需另做正整数判断 |
float 浮点数 | 129.0 | 认识二进制近似表示,今日不进入金额公式 |
bool 真值 | True、False | 商品是否上架,D02 再据此分支 |
Decimal 十进制数 | Decimal("129.00") | 商品单价和订单金额 |
运行前先写预测:
from decimal import Decimal
print(type("P1001"))
print(type(129))
print(type(129.0))
print(type(Decimal("129.00")))
print(type(True))再比较:
print("35.00" * 3)
print(Decimal("35.00") * 3)两个表达式都能运行。第一个重复文本,第二个才做十进制金额乘法。程序“没报错”只说明 Python 接受了这次操作,业务含义还要由我们判断。
金额为什么用 Decimal
中国大陆业务页面按“元”展示价格。商品资料文件把 129 元记为文本 "129.00",今天人工查看并抄入单价变量,再用 Decimal 计算。JSON 文件读写在 D04 讲解,本日不要求解析文件。Decimal 按十进制表示金额;float 适合很多测量和近似计算,但订单金额不能靠“看起来小数位够用”来保证正确。
先运行下面三行,再比较显示结果来自哪里:
print(0.1 + 0.2)
print(Decimal("0.1") + Decimal("0.2"))
print(Decimal(0.1))比较 Decimal("0.1") 与 Decimal(0.1):前者直接解析十进制文本,后者精确转换已近似的float值,会出现长串小数。129.00恰好可以被float精确表示,不能用它证明所有金额都无误差。金额从原始字符串构造;Decimal运算仍有精度和舍入规则,今天只处理两位小数单价与整数数量相乘。
金额为什么从字符串构造 Decimal?
Decimal(“0.10”) 保存十进制数值;先计算 float 再转 Decimal 会带入二进制近似值。金额计算、展示格式和存储单位要同时约定,打印两位小数不会修复计算来源。
输出、字符串与 f-string
运营看到一个裸数字,无法知道是哪件商品、买几件、单位是什么。把计算结果放进带标签的文字,才能对应商城订单明细。
print("商品", demo_product_id)
print(f"单价:{demo_unit_price_yuan:.2f} 元")
print(f"数量:{demo_quantity}")
print(f"行金额:{demo_line_total_yuan:.2f} 元")f-string 在引号前写 f,把 {} 中的表达式求值后放进文本。:.2f 表示按小数点后两位显示,例如 Decimal("35") 显示为 35.00;它控制展示,不会修复错误的金额来源。输出要让人看得懂:金额应同时显示数值和“元”,不能让运营猜单位。
商品编号首尾多空格时不容易核对,.strip() 可以去掉首尾空白。调用现成工具的方法先写对象,再写点和方法名,最后是括号;今天只会调用,不要求自己定义函数。下面的 lower() 和 len() 作为查阅实验,分别转小写、查看长度,不用于本日商品编号改写:
label = " P1001 "
print(label.strip())
print(label.lower())
print(len(label))数量从 1 改成 2,哪些信息应变化,哪些不应变化?
在今天不含优惠和运费的规则中,数量和行金额改变,商品编号、名称和单价不变。真实平台的优惠规则另外观察,不能擅自加进今天的公式。
运营收到一个裸数字“258”,还缺什么信息才能核对?
还需商品标识、单价、数量、币种和优惠含义;输出要标明人民币元及字段,不能只显示一个无法解释的数字。
input、类型转换与失败边界
用户每改一次数量,都要改源码显然不方便。先让程序从终端读数量;将来商城页面也要把输入转换成规则需要的类型。在 labs/d01_language_lab.py 运行:
raw_quantity = input("请输入演示数量:").strip()
print(raw_quantity)
print(type(raw_quantity))键盘输入 3 后,raw_quantity 仍是 str。需要算术时,程序必须显式转换:
quantity = int(raw_quantity)再试一次输入 三。你会得到 ValueError。今天先读懂这个失败;W01-D02 再用条件和异常处理输入边界。
0、-1 可以转成整数,却不是商城允许的购买数量。今天先记录这个业务缺口;“能转成数字”和“可以下单”是两件事。D02 再教判断和异常处理,本日不提前使用 if 或 try/except。
不要使用 eval() 把用户文本直接当 Python 代码执行。方便的同时,它也打开了不该打开的代码执行入口。
常用算术运算
| 运算符 | 含义 | 快速例子 |
|---|---|---|
+ - * | 加、减、乘 | 金额汇总、差额、单价×数量 |
/ | 真除法;两个整数相除得到 float | 7 / 2 → 3.5 |
// | 向下取整除法 | 7 // 2 → 3 |
% | 取余 | 7 % 2 → 1 |
** | 幂 | 2 ** 3 → 8 |
合计会用加法,差额会用减法,按批处理时可用向下取整和余数;幂运算今天只认识符号,不硬加到商城任务。今天的项目只使用乘法。+= 会在 W01-D02 批量累计时进入主任务。
今天项目:电商商品金额计算器
运营给出:商品 P1001,名称轻羽无线鼠标,单价 129.00 元,第一次输入数量 2。单价来自商品资料,不能让购买者任意提交价格。
129.00 × 2 = 258.00(元)然后从当天领取的 Student Starter(学生代码骨架) 完成自己的 src/order_rules.py。decimal 是 Python 标准库,不需要额外安装;先不用条件、循环、函数和第三方依赖。
python src/order_rules.py不要一次写完。先输出商品资料,再读数量并查看类型,然后计算行金额,最后补齐展示。每一步都先说预期再运行。
完成初稿后运行 python checks/check_d01.py。骨架第一次会因 TODO 未完成而失败,补全后重跑;今天只读检查结果,不学习工具内部实现。再手工换为 P1003/随行保温杯/89.00,数量 4,独立核对后恢复默认商品。
运行后互相追问:
product_id为什么用str?- 哪两个变量参加了乘法?
- 结果是什么类型?
- 单位在哪里体现?
- 如果数量变成 3,修改前你预测多少?
把 Traceback 当作定位线索
错误会阻断商城输入和金额计算,先知道在哪一行、哪一类问题,才能做小范围修复。今天先认识四类常见错误:
| 错误 | 先问什么 |
|---|---|
SyntaxError | 这一行的结构能否被 Python 解析? |
NameError | 使用的名称是否存在,拼写是否一致? |
TypeError | 当前操作是否允许用于这种类型? |
ValueError | 类型方向没错,但这个具体值合法吗? |
SyntaxError 发生在解析阶段,通常给出文件、行号和语法提示,不一定有完整 Traceback。我们故意把一个已经定义的变量名改错,制造 NameError,保存完整 Traceback。处理顺序固定:
- 从最后一行读错误类型和摘要;
- 找文件与行号;
- 写下一个最小原因假设;
- 只改一处;
- 重跑原输入;
- 再跑一个未见变式。
先别看答案,也别让 AI 整份重写。你需要亲手走完一次“发现—定位—修复—复验”。
程序报错时为什么先看 Traceback 最后一段?
最后一段给异常类型和直接失败位置,再沿调用路径寻找输入来源;不能只改报错行而忽略前面把数字读成字符串的原因。修改后要用原输入复验。
Git 保存可比较的起点
环境阶段先完成 Git 安装和仓库初始化;金额与错误都能看懂后,再回到本节保存能运行的基线,准备让 AI 帮忙改代码。先存一份能运行的版本,否则改坏以后,我们连旧版本的代码都没有了。
保存文件写入磁盘;Git提交记录版本。工作区是正在编辑的文件,暂存区是选入下一次提交的内容,本地仓库保存提交历史。git add暂存当时的内容,之后再次编辑不会自动更新暂存区。git commit保存暂存区,不等于上传远程。
git status查看状态;git diff查看未暂存修改;git diff --staged查看已暂存修改;git log --oneline -5查看最近提交。首次未跟踪文件也不会自动出现在普通diff中,要先阅读文件,再暂存并用staged diff核对。每条命令先解释作用再演示。
Git 是今天第一次正式使用的新软件,先确认你电脑是否已经安装:
git --version
where.exe git两条命令都能返回结果,而且 where.exe git 指向 Git for Windows,才进入下面的项目命令。如果出现“无法将 git 识别为命令”,按这条路线完成安装:
- 打开 Git for Windows 官方安装页,Intel/AMD Windows 选择 x64,Windows on ARM 才选择 ARM64;不要从第三方软件站下载。
- 运行安装器。PATH 选择允许“命令行和第三方软件”使用 Git;保留 Git 自带 OpenSSH、Git Credential Manager 和其余默认项。
- 完全退出 TRAE Code CN,再重新打开你的项目,让新终端重新读取 PATH。
- 再运行
git --version、where.exe git。还找不到时,不要反复重装,先检查终端是否重开、安装是否完成以及 PATH 是否生效。 - 需要逐屏说明、身份配置和故障处理时,打开 Git for Windows 安装与本地配置手册。
现在再为当前项目建立第一条可比较的起点:
git init
git branch -M main
git status --short
git add .
git diff --staged
git commit -m "chore: initialize w01 order rules"
git status --short若出现 Author identity unknown,说明Git 不知道你的用户名(user.name) 和 邮箱(user.email),提交代码时无法识别作者身份,直接阻止 git commit。
git config user.name "你的名字"
git config user.email "你的邮箱"
上述身份配置只针对当前项目,填写自己的提交署名,不需要上传远程。
执行git add前先确认只包含本项目文件,.venv/已忽略,不提交密钥或个人信息。提交后用git log --oneline -5核对记录。
Git 只能看到文件改了什么,但它没法判断你是不是真的懂这些改动。所以每次提交代码前,还是要看 diff、跑一遍代码,想清楚改动的含义。
AI 编程闭环
AI 可以在聊天框、IDE 或 Agent(智能体) 中工作。界面会变,人的责任不会消失。
现在仓库已经有一条干净的基线,再让 AI 只改一处输出标签。Prompt(提示词) 写清四件事:
背景:这是 W01 的人民币元金额练习,Python 使用 Decimal。
任务:改善一处输出标签,让运营能看懂单位。
约束:只改 src/order_rules.py 的输出标签;保留Decimal类型、变量和金额算法;输出引用实际变量,不写死示例答案;不新增条件、循环、函数或依赖。
验收:同一输入修改前后的计算结果保持一致,标签符合要求;换单价或数量后输出随计算变化;我能解释全部diff。报告实际运行的验证,未执行的明确说明。拿到候选后不要立即接受:
git diff
python src/order_rules.py如果 AI 改了金额类型、重写整个文件或用了你解释不出的写法,直接拒绝,带着具体问题重新提问。
计算正确,输出也可能错误
AI 可能给出看似正确的修改。例如把输出改成print("合计:258.00 元"),原数据看起来正确,但数量改成3后仍显示258.00。
先手算387.00,再运行对照,能发现输出写死。检查变量值不足以发现这个问题,必须检查最终输出。今天手动换数据验证,测试框架留到D05。修正时让输出引用金额变量,再跑原数据和变式。
验证后先恢复固定数据,检查diff,再暂存、用git diff --staged确认并提交;最后查看状态和提交历史。
AI 给出能运行的代码,为什么仍需检查 diff?
能运行只证明这一次输入未失败。检查改了哪些文件、金额类型和业务边界,再用手算结果与一个错误输入核对,保留修改前提交。
独立完成后,证明它真的会跟着数据变化
按任务书完成 A—G:先手算再运行,既看变量也看最终文字。把数量改成 3 后仍输出 258.00,即使程序不报错也不通过。换商品后先预测,记录运行,再恢复默认数据。
今天的输出要回答四个问题:什么商品、单价多少、买几件、这一行多少钱。每个人再解释一次输入转换、一次错误定位和一处接受或拒绝的 AI 改动。
预习的六个问题已在对应位置解答:数量变化、数字缺少的含义、执行链、金额来源、错误定位、AI 审查。用自己运行的结果修正原先判断。
留给下一阶段
现在回到开场的同一商品买两件:你能说明输入怎样变成 258.00 元,也能用另一组数量检查 AI 没有写死答案。明天把输入换成“二”、0 和不存在的商品,再让程序决定哪些订单可以继续。



