第 03 课
实验1:网络运行日志模拟与数据准备
本课从“怎样把一次网络事件记录清楚”出发,先设计并补全 network_log.py,再清理输入、制作日志观察卡。综合使用已学类型、字符串方法、运算、比较和格式化,通过七组运行与错误修正准备原始日志。
从规范日志到日志观察卡
设备发生了什么,怎样记录下来?先确定每条日志需要哪些信息、统一怎样的单位和顺序,再用前两课学过的 Python 写出一条完整记录。
学完你将能够
学习目标
- 说明日志的用途,确定每条记录的六项信息、排列顺序与耗时单位。
- 区分固定文字与键盘输入,解释为什么只有耗时需要 float 转换。
- 补全五处语句,按输入、转换、计算、输出的顺序运行程序。
- 用手算发现秒与毫秒的换算错误,修改后用相同输入重新运行。
- 完成 A—G 七组运行,用最终程序生成并手动保存 A、B、C 三条原始日志。
- 使用 strip、upper 清理描述信息,跟踪原文字与新字符串的变化。
- 综合使用 int、整除、余数、减法、除法、比较和格式化,完成日志观察卡。
- 预测赋值更新与运算顺序,区分四类报错和逻辑错误,并完成自己的修复记录。
开始操作前
准备工作
- 智能科技学院;实验地点:新工科实验楼514实验室。
- 沿用 Python 3.10.11 与 VS Code。回顾 str、int、float、bool、字符串方法、算术与比较、赋值更新、input、print、type 和 f-string。
- 读完第一模块的设计,再下载一个 network_log.py。网页就是本课的实验指导。
- 耗时以秒输入,取不小于 0 的数字,不附带 s 或 ms;级别、事件按表中大写文字输入。
- 截图来自 macOS 的真实 VS Code。Windows 用 Ctrl+S 保存,Mac 用 Command+S;窗口位置可能略有不同。
本课学习路线
按照学习模块逐步完成
每个模块都包含理解、跟随操作和独立实践。边理解,边操作
先确定要记录什么,再打开骨架
先设计一条记录应有的内容,接着决定程序怎样得到这些内容。要做什么:把一次网络事件记录清楚
网络设备连接成功、响应较慢或登录失败时,需要留下记录,以便以后查找发生了什么。这种按统一格式保存的事件记录叫作日志。本课使用课堂给定的信息模拟一次事件,不连接真实设备。
课程项目是“基于 Python 的网络运行日志分析与异常检测系统”。今天完成第一步:准备格式一致的原始日志。只有每条记录的含义、顺序和单位一致,后续才能可靠地分类、统计和比较。
第一步:从一条有用的记录倒推信息
一条记录要回答:什么时候、什么程度、来自哪里、哪台设备、发生什么、耗时多久。每一项信息称为一个字段。字段顺序固定后,看到同一位置就能知道它的含义。
IP 地址在这里是标识来源的文字;switch-01 是给设备取的名字。时间也是预先写好的文字,本课不读取系统时钟。INFO 表示一般信息,WARN 表示警告,ERROR 表示错误;这些只是本实验使用的文字标签,程序不会自动判断事件的严重程度。
六项信息怎样得到
前三个固定变量已在骨架中写好。每次运行只需输入耗时、级别、事件三项。输入顺序和日志输出顺序可以不同。
左右滑动表格,可查看完整内容
| 日志中的位置 | 含义与变量 | 本课怎样提供 |
|---|---|---|
| 1 时间 | timestamp:事件发生时间 | 固定文字 2026-09-19 09:00:00 |
| 2 级别 | log_level:一般信息、警告或错误 | 键盘输入 INFO / WARN / ERROR |
| 3 来源 IP | source_ip:记录来自哪里 | 固定文字 192.0.2.10 |
| 4 设备 | device:设备名称 | 固定文字 switch-01 |
| 5 事件 | event:具体发生了什么 | 键盘输入 LINK_UP / HIGH_LATENCY / LOGIN_FAILED |
| 6 耗时 | duration_ms:事件耗时 | 输入秒数,再乘 1000 得到毫秒 |
第二步:决定哪些保持文字,哪些需要计算
级别、事件、时间、IP 和设备名称用于描述事件,保留字符串。耗时需要换算单位:1 秒=1000 毫秒,所以耗时(毫秒)=耗时(秒)×1000。先把 input 得到的耗时文字交给 float,再做乘法。
例如 0.125 秒应得到 125 毫秒。单位写在设计约定里,日志最后一项只放数值,两位小数,不再附带 ms;这样每条记录都遵守相同的格式。
第三步:安排执行顺序
先用中文写清每一步做什么,再把它变成语句。
左右滑动表格,可查看完整内容
| 区域 | 要做什么 | 为什么在这个位置 |
|---|---|---|
| 输入 | 保存固定文字;依次询问耗时、级别、事件 | 后面需要这些值 |
| 转换 | 只把耗时文字转为 float | 乘法需要数值,描述信息继续用文字 |
| 计算 | 秒数乘 1000,得到毫秒数 | 输出前先统一单位 |
| 输出 | 先拼前三项,再接后三项,print 显示整条日志 | 固定六项顺序,以 | 分隔 |
第四步:在动手前想好如何验证
先用 0.125 秒手算 125 毫秒,再运行程序比较。接着用 1.5 秒检查另一个非零输入,再用 0 秒观察零耗时。同时更换级别和事件,确认输出来自本次输入,而不是把第一组结果写死。
每次启动程序只生成一条记录。需要三条,就在终端运行三次;把正确输出复制到 VS Code 的文本文件中保存。这一步是编辑器操作,程序本身只负责终端显示。
先写自己的设计
在报告第五部分或纸上写完下面四点,再开始编写。
- 用一句话说明日志有什么用,最后应显示什么。
- 写出六项信息,圈出三个键盘输入,标明耗时的输入与输出单位。
- 画出“输入 → 转换 → 计算 → 输出”的顺序,说明各步依赖什么。
- 写出第一组预期结果,并说明还要更换哪些输入。
把学过的知识用在什么地方
先完成基础日志,再完成输入清理、观察卡和排错。后面三项也是本次必做任务。
左右滑动表格,可查看完整内容
| 已学知识 | 本课怎样使用 | 需要说明的结果 |
|---|---|---|
| 变量命名、赋值、注释 | 用有含义的名字,写文件说明,跟踪赋值更新 | 名字、当前值与说明文字各有什么作用 |
| str、int、float、bool | 日志文字、整秒、小数耗时、比较结果 | 用 type 分别观察四种类型 |
| 字符串方法 | 去掉两端空格,统一英文大小写 | 为什么必须保存方法返回值 |
| 算术、比较、运算顺序 | 换单位、拆分计时、求差值与倍数、判断是否达到阈值 | 先手算,再解释每个表达式 |
| 格式化、转义、错误定位 | 制作观察卡,阅读报错,修复后复测 | 显示形式、实际数值与程序正确性有什么不同 |
下载 Python 起始文件
只下载这一个 .py 文件。先完成基础日志的五处补全与一次订正,再按后续模块扩充同一个程序。
- 新建“实验1”文件夹,把文件保存在其中。
- 固定信息与耗时输入示范已给出;先运行已有部分,再逐步补全。
在 VS Code 打开骨架
# 实验1:网络日志数据准备
# 一、输入:固定信息已经给出,三项事件信息由键盘输入。
timestamp = "2026-09-19 09:00:00"
source_ip = "192.0.2.10"
device = "switch-01"
duration_text = input("请输入事件耗时(秒):")
# 补全1:用 input 将日志级别保存到 log_level。
# 补全2:用 input 将事件名称保存到 event。
# 二、转换:只把需要计算的耗时转成数值。
duration_seconds = float(duration_text)
# 三、计算:在第三模块手算后,按第四模块加入表达式。
# 耗时从秒换算为毫秒,结果保存在 duration_ms。
# 四、输出:现在只观察已有输入,完成后替换这两行。
print("输入文字:", duration_text, type(duration_text))
print("转换数值:", duration_seconds, type(duration_seconds))
# 补全3:用 f-string 将时间、级别、IP 拼为 log_head。
# 补全4:用 f-string 加上设备、事件、毫秒耗时,得到 log_line。
# 补全5:用 print 输出 log_line。下载文件已包含以下内容。需要重新开始时才全选替换;保存后可以运行,目前只观察一项耗时输入。
准备完成
确认自己编辑的是本课文件。
- 指出三个固定文字变量和一项已有输入。
- 找到五条“补全”注释:两项输入、两段日志文字、一次 print。
- 说明 # 后的注释为什么不会被执行。
边理解,边操作
输入事件信息,观察文字与数值
先看一项输入怎样执行,再仿写另外两项。输入不会自动理解单位
执行 input 时,程序显示提示并等待;按 Enter 后才继续。input 得到 str,也就是字符串。float 把数字文字转换成数值,type 用于观察类型,print 用于显示;这些都是第二课用过的 Python 内置函数。
duration_text 保留原文字,duration_seconds 保存转换后的数值。级别和事件只参与文字组合,不需要转成 float。
duration_text = input("请输入事件耗时(秒):")
duration_seconds = float(duration_text)两行已在骨架中,不要重复追加。input 放输入区,float 放转换区;仿写级别和事件时只需要 input。
python network_log.py保存文件,选择“终端 → 新建终端”。终端应位于包含 network_log.py 的“实验1”文件夹。命令写在终端,不写进 .py;沿用 python3 的同学将开头换成 python3。
先运行起始骨架
补全1与2:仿写两项输入
在输入区替换对应注释;不要写入 INFO 或 LINK_UP 作为固定赋值。
- 用 input 询问日志级别并赋给 log_level,提示可输入 INFO、WARN、ERROR。
- 用 input 询问事件名称并赋给 event,提示可输入 LINK_UP、HIGH_LATENCY、LOGIN_FAILED。
- 保留原来的 float;不为级别或事件添加 float。
print("耗时文字:", duration_text, type(duration_text))
print("耗时数值:", duration_seconds, type(duration_seconds))
print("日志级别:", log_level, type(log_level))
print("事件名称:", event, type(event))两项 input 都完成后,用这四行替换输出区已有的两行 print。此时所有被引用的变量都已建立,可以保存运行。
重新运行,依次输入 0.125、INFO、LINK_UP
本模块完成后
用自己的输入再试一次。
- 三项 input 按顺序等待,输入确实进入对应变量。
- 能解释为何 IP、级别、事件不能都转换为 float。
边理解,边操作
先手算单位,再设计日志文字
数值含义正确、字段顺序一致,才能成为可用的记录。秒变成毫秒,数值为什么变大
毫秒是更小的单位。1 秒包含 1000 毫秒,所以同一段耗时用毫秒表示时,数值是秒数的 1000 倍。变量名中的 seconds 和 ms 帮助我们记住单位,但改变量名并不会改变数值。
先手算,再对照
把算式与单位写入报告,随后与实际输出比较。
左右滑动表格,可查看完整内容
| 用例 | 输入秒数 | 数学算式 | 日志末项应显示 |
|---|---|---|---|
| A | 0.125 | 0.125 × 1000=125 毫秒 | 125.00 |
| B | 1.5 | 1.5 × 1000=1500 毫秒 | 1500.00 |
| C | 0 | 0 × 1000=0 毫秒 | 0.00 |
日志是按约定组合的一段文字
沿用第二课的 f-string:在引号前加 f,用花括号把变量的值放入文字。| 在引号里面只是一个分隔字符,这里不是新的运算符。每条日志共六项、五个竖线,顺序是时间、级别、IP、设备、事件、毫秒耗时。
先将前三项组合成 log_head,再用它接上后三项得到 log_line。拆成两行,方便看清每一项的位置;这两个变量都保存字符串。输入先问耗时,输出最后放耗时,是因为提示顺序与记录格式由不同的语句决定。
print(f"{125.0:.2f}")这里只演示显示效果,放在临时练习中观察即可,不要追加到最终日志。第二课已用过 :.2f;它不会替你完成乘法。
写出自己的组合方案
先用中文或纸笔设计,不急着运行。
- 按顺序写下六个变量名,并在相邻两项之间画一个 |。
- 前三项命名为 log_head,完整一行命名为 log_line。
- 说明为什么最后一项用 duration_ms,而不是 duration_text 或 duration_seconds。
边理解,边操作
补全输出,观察第一次完整运行
先把程序接通,再比较日志末项与手算结果。# 这行遗漏了单位换算。先观察首次结果,再修正。
duration_ms = duration_seconds追加到计算区。下行特意遗漏单位换算,用来练习发现逻辑错误;记录首次现象后必须修正,不能把它作为正确公式。
补全3、4、5:组合并显示日志
删除或注释临时类型观察语句,再在输出区完成三行。三行全部完成后才能运行。
- log_head:用 f-string 按顺序放入 timestamp、log_level、source_ip,中间用 | 分隔。
- log_line:接上 device、event、duration_ms;耗时使用 :.2f。注意 log_head 后也要有 |。
- 用 print 显示 log_line,不要把变量名写成引号中的文字。
# log_head = 用 f-string 组合“时间|级别|IP”
# log_line = 用 f-string 组合“log_head|设备|事件|毫秒耗时”
# 最后输出 log_line这是动作提示,替换输出区原来的补全注释。先自己把注释变成三行语句;未完成 log_head 与 log_line 之前,不要提前写 print(log_line) 后运行。
保存后完整运行 A
为什么首次显示的是 0.12
错误表达式把 0.125 原样保存,再用 :.2f 显示成 0.12。此时先核对转换前后的值与单位;两位小数只是显示要求,真正缺少的是秒到毫秒的乘法。
保留首次现象
不要只写“程序错了”。
- 记录输入 0.125、INFO、LINK_UP 与实际日志末项 0.12。
- 指出字段顺序是否正确,数值的问题发生在哪一步。
边理解,边操作
修正单位错误,用原输入复测
让修改前后的结果可以直接比较。沿变量逐步寻找原因
duration_text 是文字“0.125”;duration_seconds 是数值 0.125,单位为秒。若直接赋给 duration_ms,单位仍是秒。Python 不知道这些名字代表的单位,因此不会因漏乘 1000 而报错。这是语句可以执行、含义却不符合任务的逻辑错误。
按顺序完成修改
- 01
先解释,再改表达式
这样做找到计算区的 duration_ms 赋值,用手算的关系修正。替换原来的这一行,不要在后面再追加一行同名赋值。
完成后应看到
计算区只有一条 duration_ms 赋值,明确完成秒到毫秒换算。
duration_ms = duration_seconds * 1000自己修改完成后再对照。用下行替换待核对表达式,其余输入、转换与输出保持不变。
使用同一组输入再次运行
在报告中填写五格修正记录
每格写自己的观察与解释。
左右滑动表格,可查看完整内容
| 项目 | 需要写清什么 |
|---|---|
| 现象 | 哪组输入得到什么实际值,与手算差多少 |
| 位置 | 哪一条变量赋值出现问题 |
| 原因 | 把哪个单位误当成哪个单位 |
| 修改 | 怎样补上换算关系 |
| 复测结果 | 使用原输入后实际得到什么 |
本模块完成后
口头解释两件事。
- 为什么修改变量名称或小数位数不能完成单位换算?
- 为什么先用原输入复测,再更换其他输入?
边理解,边操作
更换输入,得到三条正确记录
每组都先预测、再运行、再记录,分别观察数值和文字。三组固定用例
输入顺序始终是耗时、级别、事件。固定时间、IP 和设备保持不变;它们是三次课堂情境练习,不代表实际采集的连续事件。
左右滑动表格,可查看完整内容
| 用例 | 耗时(秒) | 级别 | 事件及含义 | 末项预期(毫秒) |
|---|---|---|---|---|
| A | 0.125 | INFO | LINK_UP:连接建立 | 125.00 |
| B | 1.5 | WARN | HIGH_LATENCY:响应延迟较高 | 1500.00 |
| C | 0 | ERROR | LOGIN_FAILED:登录失败 | 0.00 |
本课标签怎样使用
按表中约定输入级别和事件,不让程序自行选择标签。C 的 0 只表示这次课堂样例把耗时设为零,用来观察零值;不能由它推断真实登录失败的耗时都为零。
分别重新启动程序运行 B 和 C
完成自己的运行表
在报告第六部分逐组写输入、预期、实际输出、是否一致。
- 三组实际输出都来自本人运行,不直接把预期值抄到实际结果栏。
- 解释为什么零值不能单独证明公式正确。
- 核对日志没有遗漏字段、多出竖线或附带耗时单位。
边理解,边操作
清理输入,让同一事件写法一致
在已有程序上使用第二课的字符串方法,观察原值与新值。为什么输入相同含义,文字仍可能不同
带首尾空格的 info 和 INFO 对人来说含义相同,但它们是不同的字符串。日志要使用一致写法:strip() 删除两端空白,upper() 将英文转为大写。方法属于字符串,点号左侧是这次处理的对象,圆括号表示现在调用。
两种方法都返回新字符串。只写 log_level.strip() 不会改掉原值;必须把返回值赋给变量。本课分开写,便于看清每一次变化。它们不会删除文字中间的空格,也不会判断事件名称是否属于允许的名称。
log_level_text = log_level
log_level_clean = log_level_text.strip()
log_level = log_level_clean.upper()
# 仿照上面三行,保留 event_text,清理空白并把 event 转为大写。在转换区的 float 之后追加,位于计算与日志组合之前。输入区原有三个 input 不变;仿写事件的三行后才运行下一步。
用四个问题跟踪字符串
在报告中写出每个变量的值,空格用方括号边界帮助辨认。
- log_level_text 为什么还保留原来的空格和小写?
- log_level_clean 与 log_level 分别经过什么处理?
- 仿写 event_text、event_clean 和 event 的三行赋值。
- 临时在输出区用 print(f"原级别:[{log_level_text}],清理后:[{log_level}]") 观察;事件也仿写一行。
运行 D:带空格与小写的输入
清理完成后再想一步
解释一个成功情况和一个能力范围。
- 用 type 说明清理前后都还是 str。
- 说明为什么输入 high latency 时,strip 与 upper 不会自动把中间空格变成下划线。仍应按事件名称约定输入。
边理解,边操作
制作日志观察卡,综合使用类型与运算
六项日志供后续课程使用,观察卡帮助你理解本次运行;两者分行显示。先设计观察卡要回答的问题
本次事件用了几分几秒?比给定耗时标准多或少多少?是否达到这个标准?把用于比较的标准叫作阈值,本实验约定为 1000 毫秒;它是课堂给定值,不是所有网络事件通用的判定标准。
观察卡只显示数值与 True / False。比较运算本身就能产生 bool,不需要 if;它不会改写你输入的级别,也不会让程序选择另一段代码。日志六项的格式继续保持一致。
从问题写出表达式
先在纸上写算式,再把下表转换成代码。新变量都放在毫秒换算之后、输出之前。
左右滑动表格,可查看完整内容
| 想知道什么 | 使用的变量 | 已学知识与注意事项 |
|---|---|---|
| 完整分钟和剩余整秒 | whole_seconds、minutes、seconds | int 产生整秒新值;// 60 得到分钟,% 60 得到余秒 |
| 比阈值多或少多少毫秒 | difference_ms | 用 duration_ms 减 SLOW_LIMIT_MS;负数表示低于阈值 |
| 是阈值的多少倍 | threshold_ratio | 用 duration_ms 除 SLOW_LIMIT_MS;阈值固定为正数 |
| 是否达到阈值 | is_slow | 使用 >=;必须包含恰好相等的情况 |
| 输入级别是否为 ERROR | is_error | 使用 == 与字符串 "ERROR" 比较;一个 = 用于赋值 |
# 追加到计算区,放在 duration_ms 换算之后。
SLOW_LIMIT_MS = 1_000
whole_seconds = int(duration_seconds)
# 补全:minutes 保存完整分钟,seconds 保存剩余整秒。
# 补全:difference_ms 保存毫秒耗时减去 SLOW_LIMIT_MS 的差值。
# 补全:threshold_ratio 保存毫秒耗时除以 SLOW_LIMIT_MS 的倍数。
# 补全:is_slow 比较毫秒耗时是否大于或等于 SLOW_LIMIT_MS。
# 补全:is_error 比较 log_level 是否等于字符串 ERROR。追加到计算区,替换六条变量任务所需的语句。先只完成计算,不提前输出尚未建立的变量。SLOW_LIMIT_MS 全大写是常量命名约定;1_000 就是 1000,并没有变成字符串。
为什么保留原小数耗时
int(61.25) 得到新整数 61,不是四舍五入;原来的 duration_seconds 仍保存 61.25,duration_ms 仍为 61250.0。计时只展示完整秒数,原始日志仍保留小数耗时换算后的数值。61 // 60 和 61 % 60 分别得到 1 分钟和 1 秒。
# 计算区六个变量都完成后,追加到 print(log_line) 后。
print("\n=== 日志观察卡 ===")
# 补全:用 :02d 显示 minutes:seconds。
# 补全:用 :.2f 显示 difference_ms 与 threshold_ratio,并写清含义。
# 补全:显示 is_slow 和 is_error,解释两个 True / False。先完成计算区,再在原有 print(log_line) 后追加。把注释变成输出语句;此前三项输入和六字段日志输出仍要保留。
输出格式各自负责什么
沿用第二课的 :02d,把整数分钟和秒都显示为两位;:.2f 用来显示差值和倍数;两个 bool 直接放进 f-string。标题中的 \n 是换行符,运行时先换一行,不会打印反斜杠和字母 n。
计时、差值、倍数和比较结果都应有中文说明。观察卡放在日志下一段,不能拼进六字段日志。清理方法和计算必须先执行,输出才能使用新值。
三组观察卡用例
E、F 使用 INFO 和 LINK_UP;G 使用 ERROR 和 LOGIN_FAILED。每次都记录完整日志与观察卡,先预测再运行。
左右滑动表格,可查看完整内容
| 用例与耗时 | 计时 | 差值 毫秒 | 阈值倍数 | 达到阈值 / ERROR标签 |
|---|---|---|---|---|
| E:0.999 秒 | 00:00 | -1.00 | 1.00 | False / False |
| F:1 秒 | 00:01 | 0.00 | 1.00 | True / False |
| G:61.25 秒 | 01:01 | 60250.00 | 61.25 | True / True |
先试阈值两侧,再看跨分钟的情况
观察卡完成条件
不看示范,用自己的话解释一条完整执行路线。
- 输入原文字 → 清理级别与事件 → 转换耗时 → 换算毫秒 → 计算计时和比较结果 → 显示日志及观察卡。
- 指出四种类型各对应哪个变量,并说明类型转换、单位换算、格式化的区别。
- 把 E、F、G 的预期值和本人实际值写进报告第六部分;相等情况 F 不能省略。
边理解,边操作
预测代码变化,修复常见错误
把已学知识用在阅读、改写和排错中。临时练习与最终日志程序分开保存。先预测,再运行验证
在同一文件夹新建 scratch.py,专门做短代码实验,不需要下载新材料或提交这个文件。下面各片段互相独立,每次全选替换临时文件内容,保存后运行 python scratch.py;不要覆盖已经完成的 network_log.py。
下面假定本轮开始前有 2 条记录,再记入 1 条。先在纸上逐行写值,不要先看运行结果。保存到 before_count 的是赋值那一刻的整数值。
record_count = 2
before_count = record_count
record_count += 1
print(before_count, record_count)
print(2 + 1 * 1000)
print((2 + 1) * 1000)
print(10 ** 3)仅放入 scratch.py。先写四行预期输出,再保存运行;之后再运行一次,观察是否从原来的初始值重新开始。
写出逐行记录
在报告中记录 before_count 与 record_count 的变化,并解释三个算式。
- 区分 =、==、+= 的作用;把 += 改写为普通赋值后再核对输出。
- 比较有无括号的两条算式,指出哪一步先执行。
- 用 10 ** 3、1_000、1000 三种写法得到相同数值;说明 ** 是乘方。
- 重新运行后仍从 2 开始;说明为什么这个短程序没有保存上次运行的计数。
先判断,再选择两项亲手修复
四项都先写错误类别与修改建议,再至少选择两项在 scratch.py 实际运行、修复、复测。每次只放一个片段,避免前一个错误挡住后面的观察。
左右滑动表格,可查看完整内容
| 临时片段 | 先判断什么 | 修复后的目标 |
|---|---|---|
| print("日志观察卡) | 字符串引号是否成对 | 完整显示日志观察卡 |
| duration_ms = 125 print(duration_mss) | 定义与使用的名字是否一致 | 显示 125 |
| duration_seconds = float("0.125s") | 待转换的文字是否只包含数字 | 显示数值 0.125 |
| print("125" + 1000) | 加法两侧的类型是否匹配 | 完成数值加法,显示 1125 |
duration_ms = 125
print(duration_mss)将下面内容全选复制到 scratch.py。这是故意写错的名字;先观察报错最后一行及指向位置,再只改一处拼写,保存并复测。其他错误片段按上表单独输入。
演示一次名字错误的修复
给程序写自己的说明
回到 network_log.py,补充说明文字,并完成两份简短排错记录。
- 在文件最开头写三引号说明:用途、三个输入、两类输出、秒与毫秒约定;保留关键计算旁的 # 注释。说明文字不会自动显示。
- 检查名字是否能表达含义,不用 print、input 作为变量名;说明为什么不能使用 2duration 或 duration-ms。
- 四项分别判断为 SyntaxError、NameError、ValueError、TypeError;把自己实做的两项记录为“现象—原因—修改—复测”。
- 其中 ValueError 片段修正后需要自己加 print 才能看见转换值;赋值本身不会打印。
边理解,边操作
保存原始日志,整理实验报告
把程序生成的记录留下,作为后续分析的起点。终端显示与文件保存是两件事
print 只把文字显示在终端,不会自动创建日志文件。本课用已熟悉的编辑器操作手动保存三条正确输出;程序仍是一个按顺序执行的小程序。原始日志就是这些尚未做分类和统计的记录。
完成扩充后,用最终程序再运行 A、B、C。只把每次的六字段日志保存为 network.log,观察卡留在报告中。下面两张图展示只保留三行原始记录的做法;你当前终端还会多出观察卡,这是正常的。
把本人的正确输出保存为 network.log
实验报告下载与提交
从模板开始,把自己的设计、运行结果和分析整理成一份完整报告。
- 下载模板
使用本课报告模板,补充封面个人信息。
- 完成报告
从第四部分开始填写,将本人运行截图放入正文。
- 提交实验1
选择本人班级和实验1,核对姓名、学号,上传一份报告。
在新窗口打开 WPS 表单,登录后填写。
报告填写提示
学院、地点和前三部分已填写。第四部分填写实验环境,第五部分填写设计与操作,第六部分填写结果与分析,第七部分填写收获与思考,保留模板原有格式。
- 封面补充个人信息,实验日期填写实际日期。
- 实际运行表和五格修正记录写进第六部分,无需另外下载记录表。
- 使用 AI 时说明询问内容及自己的验证方法;未使用则如实填写。
整理四类成果
基础日志、清理、观察卡、预测与排错均为必做;临时 scratch.py 不需提交。
- network_log.py:基础日志与清理、观察卡完整,说明文字齐全,临时类型观察输出已注释。
- network.log:用最终程序生成的 A、B、C 三条日志,每条六项,UTF-8 保存;不混入观察卡。
- 四张本人截图:基础纠错前后、B/C日志、D清理对照、G观察卡。E/F与两项排错的实际结果写入报告,不另外增加必交截图。
- 实验报告:设计与类型表、A至G七组实际运行、赋值与算式预测、单位错误五格记录、两项报错修复、结果解释及 AI 使用说明齐全。
选做:每次只改一项
从 A 出发,保持 INFO 和 LINK_UP,只把耗时改成 0.25,先预测是否得到 250.00。再恢复 0.125,只把级别改为 WARN,观察末项是否仍为 125.00。两次都不修改公式,用结果说明哪些输入影响数值、哪些输入影响文字。
遇到问题时这样处理
先确认程序停在哪一步,再采取对应动作。
左右滑动表格,可查看完整内容
| 现象 | 处理动作 |
|---|---|
| 光标停在问题后 | 单击终端,输入本项内容并按 Enter。 |
| 输入 0.125s 后无法转换 | 重新运行,只输入 0.125;单位由提示说明。 |
| 把 INFO 或 IP 放进 float | 只转换 duration_text,描述信息保留字符串。 |
| 修改后还是原结果 | 保存 network_log.py,确认运行当前实验1文件夹内的文件。 |
| 找不到程序文件 | 用“文件 → 打开文件夹”选择实验1,再新建终端;确认文件名为 network_log.py。 |
| 出现变量名错误 | 对照前面赋值,核对拼写、大小写和下划线;未建立的变量不能提前使用。 |
| 日志显示了变量名而不是值 | 核对 f-string 前的 f 和变量周围的花括号;print(log_line) 中不加引号。 |
| strip 后原值没有变 | 把返回值赋给新变量或原变量,再用于后面的日志组合。 |
| 计时把 61.25 显示成了 01:01 | 这是只显示完整秒数的计时;核对日志仍保留 61250.00 毫秒。 |
| 观察卡变量找不到 | 先补齐计算区六项赋值,再执行卡片输出;检查定义与使用顺序。 |
| 恰好 1000 毫秒却显示 False | 核对使用的是 >=,不是 >;不要用 = 代替比较。 |
| 保存的日志含命令或提示 | 回到文本文件,删除额外行,只留下本人三条正确日志。 |
实验成果如何评价
依据程序、实际记录和解释综合评价;选做不改变基础分值。
左右滑动表格,可查看完整内容
| 项目 | 分值 |
|---|---|
| 输入、清理与四种类型 | 20 |
| 单位换算、计时、差值与倍数 | 25 |
| 六项日志、比较与执行顺序 | 20 |
| 格式化、命名、注释与文件说明 | 10 |
| 七组实际运行、预测与原始日志 | 15 |
| 单位错误及两项报错的修复说明 | 10 |
把知识变成作品
本课练习
请按顺序完成以下任务,并保存自己的学习成果。- 01
用最终程序运行 A、B、C,保存三行原始日志;结合 D、E、F、G 解释清理、计时和比较结果。
- 02
指出四种类型各自的变量,逐行说明赋值、方法、转换、计算和输出怎样衔接。
- 03
用自己的预测、七组运行和三份修复记录解释:为什么程序能运行、某组结果正确,都不足以说明所有表达式正确。
把本课进度保存下来
登录后可以保存浏览内容、有效学习时间、完成状态和答题参与记录。














