课程进度 课程大纲 已发布 24/24 课
Python 基础
数据与集合
构建可靠的程序
使用对象建模
专业 Python
高级 Python
给 Python 装上交通信号灯
到目前为止,Python 一直沿着一条直路前进。一个实用的程序还需要交通信号灯:“如果答案是肯定的,就走这条路”,以及“只要还有工作没完成,就再做一次”。这就是控制流。
- 提问 提出一个结果为 True 或 False 的问题
- 选择 运行一个符合条件的分支
- 重复 直到任务完成
学完本章后,你将构建一个“7 天学习追踪器”:它会提出七个问题,统计达成目标的天数,并输出一条每周总结消息。
提出问题并选择一条路
比较会产生布尔值 True 或 False:
minutes = 35
print(minutes == 35)
print(minutes != 35)
print(minutes > 30)
print(minutes >= 40)
输出:
True
False
True
False
六个比较运算符分别是 ==、!=、>、>=、< 和 <=。请记住:一个等号用于赋值,两个等号用于比较。另外,30 == "30" 的结果是 False,因为整数和字符串是不同类型的值。
使用 if、elif 和 else 来选择且只选择一条路:
score = 82
if score >= 90:
print("Excellent")
elif score >= 60:
print("Passed")
else:
print("Try again")
输出:
Passed
- 大于或等于 90? 优秀
- 大于或等于 60? 通过
- 否则 再试一次
- 第一个匹配项胜出 然后 Python 继续往下执行
冒号会开启一个代码块。四个空格表示哪些指令属于这个代码块。缩进是 Python 语法的一部分。
当两个问题都必须为真时,用 and 连接;只要其中一个为真就足够时,用 or;要反转一个布尔值时,用 not:
minutes = 40
exercise_done = True
if minutes >= 30 and exercise_done:
print("Session complete.")
常见的“空”值——False、None、0 和 ""——在条件中会被视为假。大多数其他值会被视为真。请注意:"False" 是非空文本,所以 bool("False") 的结果是 True。
沿着循环之路前进
当你知道需要重复多少次时,使用 for:
for day in range(1, 4):
print(f"Day {day}")
输出:
Day 1
Day 2
Day 3
range(1, 4) 会在到达 4 之前停止。因此,range(1, 8) 会生成第 1 天到第 7 天。
累计总数和计数器要在循环开始前创建,并在循环内部更新:
total = 0
days_met = 0
for minutes in (30, 20, 40):
total += minutes
if minutes >= 30:
days_met += 1
print(total)
print(days_met)
输出:
90
2
当循环何时结束取决于一个不断变化的条件时,使用 while:
remaining = 3
while remaining > 0:
print(remaining)
remaining -= 1
print("Go!")
-
检查
remaining > 0是否成立? - 执行 输出这个数字
- 改变 减去 1
输出依次是 3、2、1,然后是 Go!。break 可以提前退出循环;continue 可以跳过本次循环,直接进入下一次循环。请谨慎使用它们,让程序的执行路径保持清晰易懂。
构建一个 7 天学习追踪器
将下面这个只使用标准库的完整小项目保存为 study_tracker.py:
target = int(input("Daily target in minutes: "))
total = 0
days_met = 0
for day in range(1, 8):
minutes = int(input(f"Day {day} minutes: "))
total += minutes
if minutes >= target:
days_met += 1
print("Target met.")
else:
missing = target - minutes
print(f"{missing} minutes short.")
average = total / 7
print()
print(f"Weekly total: {total} minutes")
print(f"Daily average: {average:.1f} minutes")
print(f"Target met on {days_met}/7 days")
if days_met == 7:
print("Perfect consistency!")
elif days_met >= 5:
print("Strong week.")
else:
print("Keep building the habit.")
将目标设为 30,然后依次输入 30, 20, 45, 30, 35, 10, 40。确认总结如下:
Weekly total: 210 minutes
Daily average: 30.0 minutes
Target met on 5/7 days
Strong week.
也要测试边界值:正好 30 必须被计入,因为代码使用了 >=。七天都达成目标时,应该选择“完美的坚持!”,而只有四天达成目标时,应该选择“继续培养这个习惯。”
三个小任务与循环安全
- 分数关卡。 90 分及以上输出“优秀”,60~89 分输出“通过”,低于 60 分输出“再试一次”。测试 59、60、89 和 90。
- 把 1 到 10 相加。 使用
range()和累加器,不要使用sum()。确认答案是 55。 - 安全倒计时。 请求用户输入一个起始整数,然后使用
while进行倒计时。确保每轮循环都会改变一个值,并决定输入 0 时应该怎么做。
需要特别留意的地方:把文本传给 int() 会引发 ValueError;第 10 章将处理这个问题。遗漏冒号或四个空格的缩进,会导致语法错误或缩进错误。如果 while 的条件永远不可能变为假,就会产生无限循环——按 Ctrl+C,然后找到遗漏的更新操作。
准备好给重复的任务命名了吗?
- 我能使用全部六个比较运算符产生布尔值。
- 我知道
=用于赋值,而==用于比较。 - 我能编写一条清晰的
if/elif/else条件链。 - 我能使用
and、or和not组合条件。 - 我知道
range()中的停止值不会包含在结果中。 - 我能在循环中持续维护一个总数和一个计数器。
- 我能准确解释自己的
while循环为什么会停止。 - 我的追踪器能够得到预期的 210 分钟总结。
- 我完成了三个小任务。
接下来,你会把重复的工作放进有名称的函数中,让较长的程序仍然易于阅读和测试。