学习目标:区分文本与整数,用变量计算剩余时长,用 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 | 预期结果 |
|---|---|---|
| 25 | False | 还差 35 分钟 |
| 60 | True | 目标已完成 |
| 75 | True | 目标已完成 |
如果把 >= 改成 >,60 会进入 else,输出“还差 0 分钟”。程序可以正常运行,却没有准确表达“达到目标就算完成”的需求。这类问题叫逻辑错误。
NameError:检查 minutes 是否误写成 minute,以及赋值是否在使用之前。TypeError:检查是否把 minutes = 25 改成了 minutes = "25",导致文本和整数比较。IndentationError:检查分支内四个空格,else 是否和 if 对齐。把目标改成 90,主题改成阅读。让 30 输出“还差 60”,让 90 和 120 都输出“目标已完成”。不允许为三种值分别写死三段输出。
验收:保存三次运行的结果,圈出判断相等边界的操作符。说明你的代码如何覆盖未来输入的 50,而不用再添加一个专用分支。
remaining 不放到达标后继续显示?
答案:超出目标时会得到负数,容易出现“还差 -15 分钟”这种不符合产品含义的表达。本课先把两种结果分开处理。
= 和 == 分别做什么?
答案:前者把值绑定给名字,后者比较两个值是否相等,产生 True 或 False。
你现在只能记录一次学习。下一课用一个容器保存多条记录,并让循环逐条累计。