agentmentoragentmentor

第 03 节:让程序做选择

本节 objectives:

  • 写出返回 True/False 的条件
  • if/elif/else 表达互斥分支
  • 用真值测试写出不过度复杂的判断

先修:变量、基础类型、比较表达式 | 上一节 << 02 | 下一节 04 >>

程序不会“理解情况”,它只检查条件

人会说“如果天气不好就别出门”。程序需要更具体:温度是否低于某个数?雨量是否大于 0?条件就是把模糊判断压成 TrueFalse。Python 的 if 语句根据条件真假选择执行哪一块代码1

分支写得好,程序看起来像一张清楚的决策表,而不是一串猜心术。

讲解

比较产生布尔值。 score >= 60name == "Ada"count != 0 都会得到布尔结果。注意判断相等用 ==,赋值用 =

缩进定义分支范围。 Python 用缩进表示哪些语句属于 if 里面。缩进不是排版偏好,而是语法的一部分1

elif 表示“否则如果”。 多个互斥等级适合 if/elif/else:先检查第一个条件,不满足才看下一个。顺序会影响结果。

很多值自带真假。 空字符串、空列表、数字 0 通常在条件中被看作假;非空字符串、非空列表、非零数字通常为真。这叫真值测试2

跟我做一遍(worked example)

写一个成绩标签:

python
score = 82
if score >= 90:    label = "excellent"elif score >= 60:    label = "pass"else:    label = "retry"
print(label)

这里先检查最高等级,再检查及格线。若把 score >= 60 放到最前面,95 分也会先被判成 pass,因为程序不会继续猜你是不是想要更精细标签。

换你补全(faded example)

补全判断:当 name 不是空字符串时打招呼,否则提醒输入名字。

python
name = "Ada"
if ____:    print("Hello,", name)else:    print("Please enter your name")

答案:

python
name = "Ada"
if name:    print("Hello,", name)else:    print("Please enter your name")

关键判断点是:字符串非空就是真,不必写成 name != ""

小结 + 通向下一节

分支让程序在几条路中选一条。下一节处理另一种基本控制:同一件事对很多数据重复做。

Footnotes

  1. Python Tutorial: More Control Flow Tools — https://docs.python.org/3/tutorial/controlflow.html 2

  2. Python Standard Library: Built-in Types — https://docs.python.org/3/library/stdtypes.html

练习

Level 1: 写一个年龄分组。

  • 做法:设置 age,输出 childteenadult
提示 1

可以用 age < 13age < 18 这样的递进条件。 Level 2: 常见错误剖析。

  • 做法:故意写 if score = 60: 并运行,再修复。
提示 2

看错误箭头指向哪一个符号。

看参考答案

条件位置需要一个可判断真假的表达式。

自评