← 编程起步:做一个学习记录小助手

第 02 课:把记录变成可计算的数据

学习目标:区分文本与整数,用变量计算剩余时长,用 if/else 处理达标与未达标。
前置:能完成第 01 课的运行与保存。预计 45 分钟。
本课交付:25、60、75 三种时长的预测和运行结果。

本课主线:今天的学习目标完成了吗

上一课把“Python:25 分钟”写死在字符串里。现在要让程序判断:目标是 60 分钟,记录是 25 分钟,还差多少?

先定义三个数据:主题、已学分钟、目标分钟。计算只作用于数字,最后再把结果组织成可读文本。

一个完整可运行的版本

运行 py -3 versions/02_values.py。对应完整代码:

subject = "Python"
minutes = 25
goal = 60

print(f"{subject}:{minutes} 分钟")
if minutes >= goal:
    print("今天的目标已完成")
else:
    remaining = goal - minutes
    print(f"距离目标还差 {remaining} 分钟")

预期输出:

Python:25 分钟
距离目标还差 35 分钟

跟着一个值走完程序

minutes = 25 把整数 25 绑定到名字 minutes。= 在这里是赋值,不是询问两边是否相等;比较相等使用 ==。

执行 minutes >= goal 时,实际比较的是 25 >= 60,结果为 False。因此跳过 if 下的语句,进入 else,算出 60 - 25 = 35。

缩进表示“哪些语句属于这个分支”。同一层使用四个空格,不要混用 Tab。remaining 的赋值和它的输出都在 else 里;如果程序走到达标分支,这两行不会运行。

f"...{minutes}..." 是格式化字符串。花括号中的表达式先求值,再放进文本;数字没有因此失去原来的数值类型,只是这里把它显示出来。

字符串和整数为什么不能混为一谈

单独试验这两行:

print(25 + 15)
print("25" + "15")

结果分别是 40 和 2515:整数相加,字符串拼接。符号相同,作用由操作数的类型决定。

int("25") 能把可解析的文本转成整数;int("两小时") 不能。不要为了让代码不报错,就对任何东西强行转换。第 06 课将正式处理不符合约定的输入。

边界实验:等于目标算不算完成

只改变 minutes,每次保存后运行:

minutes预测条件 minutes >= 60预期结果
25False还差 35 分钟
60True目标已完成
75True目标已完成

如果把 >= 改成 >,60 会进入 else,输出“还差 0 分钟”。程序可以正常运行,却没有准确表达“达到目标就算完成”的需求。这类问题叫逻辑错误。

常见错误与排错

动手练习与验收

把目标改成 90,主题改成阅读。让 30 输出“还差 60”,让 90 和 120 都输出“目标已完成”。不允许为三种值分别写死三段输出。

验收:保存三次运行的结果,圈出判断相等边界的操作符。说明你的代码如何覆盖未来输入的 50,而不用再添加一个专用分支。

  1. 为什么 remaining 不放到达标后继续显示?
    看答案

    答案:超出目标时会得到负数,容易出现“还差 -15 分钟”这种不符合产品含义的表达。本课先把两种结果分开处理。

  2. = 和 == 分别做什么?
    看答案

    答案:前者把值绑定给名字,后者比较两个值是否相等,产生 True 或 False。

下一步

你现在只能记录一次学习。下一课用一个容器保存多条记录,并让循环逐条累计。