JEPA4Japan · 教程

作出判断并重复工作

1,567字 5分钟阅读 #Python

使用条件、布尔逻辑、for 循环和 while 循环控制程序。

课程进度 课程大纲 已发布 24/24 课

给 Python 装上交通信号灯

到目前为止,Python 一直沿着一条直路前进。一个实用的程序还需要交通信号灯:“如果答案是肯定的,就走这条路”,以及“只要还有工作没完成,就再做一次”。这就是控制流。

  1. 提问 提出一个结果为 True 或 False 的问题
  2. 选择 运行一个符合条件的分支
  3. 重复 直到任务完成
问题决定走哪条路;循环让你在同一条路上走不止一次。

学完本章后,你将构建一个“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
  1. 大于或等于 90? 优秀
  2. 大于或等于 60? 通过
  3. 否则 再试一次
  4. 第一个匹配项胜出 然后 Python 继续往下执行
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!")
  1. 检查 remaining > 0 是否成立?
  2. 执行 输出这个数字
  3. 改变 减去 1
while 循环需要进行某种改变,使它的条件最终变为 False。

输出依次是 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 必须被计入,因为代码使用了 >=。七天都达成目标时,应该选择“完美的坚持!”,而只有四天达成目标时,应该选择“继续培养这个习惯。”

三个小任务与循环安全

  1. 分数关卡。 90 分及以上输出“优秀”,60~89 分输出“通过”,低于 60 分输出“再试一次”。测试 59、60、89 和 90。
  2. 把 1 到 10 相加。 使用 range() 和累加器,不要使用 sum()。确认答案是 55。
  3. 安全倒计时。 请求用户输入一个起始整数,然后使用 while 进行倒计时。确保每轮循环都会改变一个值,并决定输入 0 时应该怎么做。

需要特别留意的地方:把文本传给 int() 会引发 ValueError;第 10 章将处理这个问题。遗漏冒号或四个空格的缩进,会导致语法错误或缩进错误。如果 while 的条件永远不可能变为假,就会产生无限循环——按 Ctrl+C,然后找到遗漏的更新操作。

准备好给重复的任务命名了吗?

  • 我能使用全部六个比较运算符产生布尔值。
  • 我知道 = 用于赋值,而 == 用于比较。
  • 我能编写一条清晰的 if/elif/else 条件链。
  • 我能使用 and、or 和 not 组合条件。
  • 我知道 range() 中的停止值不会包含在结果中。
  • 我能在循环中持续维护一个总数和一个计数器。
  • 我能准确解释自己的 while 循环为什么会停止。
  • 我的追踪器能够得到预期的 210 分钟总结。
  • 我完成了三个小任务。

接下来,你会把重复的工作放进有名称的函数中,让较长的程序仍然易于阅读和测试。