环境与第一个程序
本章目录
本章学习目标
- 区分终端、解释器和脚本
- 使用虚拟环境确认实际运行版本
- 运行带断言的分析脚本并解释输出
一、从命令到结果的完整链条
Python 程序是文本文件,解释器读取并执行其中的语句。终端负责接收操作系统命令,解释器负责执行 Python 语言,编辑器负责修改文件,这三种角色要分清。终端中的 python hello.py 是启动程序的命令;解释器里的 print(1+2) 是 Python 表达式;脚本文件不应包含终端提示符或网页中的代码围栏。看到 >>> 通常说明已进入交互解释器,此时输入安装命令会产生语法错误。
学习时先做一个可复现的闭环:保存文件,确认文件路径,在终端调用指定解释器,读输出,修改一个输入,再运行。网页里的代码只是示例展示,复制按钮不会替你执行脚本。配套 examples 目录中的同名脚本可以直接运行;输出位置由脚本路径决定,避免当前终端目录不同导致文件被写到意外位置。程序结束返回零通常表示没有未处理异常,但并不保证业务逻辑正确,还需要检查结果。
二、版本与虚拟环境解决什么问题
一台机器可以安装多个 Python,且每个环境有独立的第三方包。单独输入 pip 时,安装目标可能与 python 不是同一个环境,所以课程运行说明使用 python -m pip。Windows 创建环境的常见命令是 py -3.13 -m venv .venv,之后可直接使用 .venv\Scripts\python.exe;无需依赖激活是否成功。Linux 中解释器通常位于 .venv/bin/python。课程以实际锁定依赖为准,不能凭电脑里已有同名包就认定版本一致。
sys.executable 显示正在运行的解释器绝对路径,sys.version 显示其版本;第三方库各自的 __version__ 则显示库版本。遇到模块找不到时,先比较这几个信息,不要反复安装到未知环境。虚拟环境不包含课程数据的备份,也不是容器;删除环境会移除依赖,但不应改变你的源码和 CSV。把环境放在课程根目录会方便使用,但交付 ZIP 不包含它,需要按运行说明重新创建。
三、第一个业务例子:订单净额
假设三笔订单原金额为一百、二百和五十,退款分别为零、二十和五十。先逐笔算净额:一百、百八十、零,再加总得到二百八十。这个例子同时说明输入、规则和输出:输入是金额与退款,规则是逐笔相减后求和,输出是总净额。不要直接把总订单数当作付款人数,也不要把退款金额再次从已经扣除退款的净额中减去。
脚本使用列表保存金额,用 zip 成对迭代,并检查两组长度相等。print 用于向人展示结果,assert 用于表达开发者预期;此处断言总额为二百八十。代码注释解释意图,变量名表明单位和含义。若后来输入发生变化,断言可能需要变成更一般的约束,例如退款不超过原金额,而不是永远要求总额固定。只有教学小数据才适合写死预期值验证。
四、错误信息也是观察工具
SyntaxError 往往来自括号、冒号或缩进,解释器尚未开始正常执行;NameError 表示名字还未定义;TypeError 表示对象类型不支持当前操作。读取 traceback 时先看最后一行的异常种类与消息,再向上找自己脚本的行号;不要只截取最后一个单词就搜索。安装问题与语法问题属于不同层次,升级依赖无法修复少写的冒号。
程序能执行但结果不对更值得注意。若把金额写成字符串,"100"+"200" 会连接文本而不是相加;若只打印了对象而没有真正调用函数,也可能没有异常。调试时先打印输入、类型和中间结果,逐步缩小范围。不要通过删除断言来获得“运行成功”。断言在 python -O 下可被移除,因此用于教学验证,不替代面对外部不可信输入的正式校验。
五、形成可重复的运行习惯
每次实验都记录运行命令、解释器路径、依赖版本、输入数据和预期结果。对本章先运行原脚本,再把第二笔退款从二十改为四十,手算新总额二百六十,然后调整教学断言;这样能够区分复制成功与真正理解。输出里出现本机绝对路径是正常现象,不同机器路径并不要求一致。
初学阶段不用追求复杂工程目录,但应养成保存后再运行、阅读异常、核对输入的习惯。把源码文件命名为 numpy.py 或 random.py 可能遮蔽同名库,导致后续导入错误,建议使用课程给定 slug 命名。前置知识为零不意味着可以忽略单位和数据粒度:从第一天就说清金额单位、每行含义和计算口径,后面的 SQL 与 pandas 才能使用同一套分析规则。
完整示例与实际输出
import sys
amounts = [100, 200, 50]
refunds = [0, 20, 50]
assert len(amounts) == len(refunds)
net = [a-r for a,r in zip(amounts, refunds)]
assert net == [100,180,0] and sum(net) == 280
print("interpreter:", sys.executable)
print("version:", sys.version.split()[0])
print("net per order:", net)
print("total net:", sum(net))
实际运行通过CPU Python execution.
interpreter: D:\liuwei\求职\笔试\notes\data_skills_html\.runtime\venv\Scripts\python.exe version: 3.13.9 net per order: [100, 180, 0] total net: 280
五道自测:先回答,再核对
01 · python hello.py 应输入到哪里?
查看提示
谁负责启动程序?
查看参考答案
操作系统终端;不是 Python 的 >>> 提示符内。
02 · 怎样确认脚本实际使用的解释器?
查看提示
sys 中有路径信息。
查看参考答案
打印 sys.executable;再结合 sys.version 确认版本。
03 · 为什么优先用 python -m pip?
查看提示
多个环境可能各有 pip。
查看参考答案
让 pip 由同一个 Python 解释器启动,减少装包环境与运行环境不一致。
04 · print 与 assert 的用途分别是什么?
查看提示
展示与检查分开。
查看参考答案
print 给人看结果;assert 检查开发预期,失败则抛 AssertionError。
05 · 退出码为零能证明净额算法正确吗?
查看提示
程序成功结束与业务正确不同。
查看参考答案
不能,还要核对规则、小数据手算及断言。
两项动手任务
任务 1 · 计算两笔金额 [80,120]、退款 [10,20] 的净额并加入断言。
提示
逐筆相减,再求和。
完整参考解答与检查方式
净额分别七十和一百,总额一百七十。
amounts=[80,120]; refunds=[10,20]
assert len(amounts)==len(refunds)
net=[a-r for a,r in zip(amounts,refunds)]
assert net==[70,100] and sum(net)==170
print(net, sum(net))任务 2 · 写脚本显示解释器、工作目录、脚本所在目录,并解释三者作用。
提示
使用 sys.executable 与 pathlib。
完整参考解答与检查方式
解释器决定执行环境,cwd 是终端当前位置,脚本父目录是文件位置;它们通常不同。
import sys
from pathlib import Path
print("interpreter",sys.executable)
print("working directory",Path.cwd())
print("script directory",Path(__file__).resolve().parent)
assert Path(sys.executable).is_file()官方资料与掌握状态
完成两项任务后,按独立完成程度记录。状态会尽量保存在当前浏览器,可导出备份。
动手任务记录
掌握状态与复习
关掉资料独立完成后记 A;提示后完成记 B;需要重学记 C。
记录尽量保存在当前浏览器,建议定期导出备份。