先看再走:if · 机器人闯关
一段程序怎样应对不同的情况?
课程目录为什么需要它
到目前为止,每段程序都只为一张地图而写。挪动一颗宝石,程序就失灵了。真实的程序要面对从没见过的数据,所以它必须先看情况,再做决定:这就是 if 的作用。
直觉理解
「如果下雨,就带伞。」先检查一个条件,只有条件成立才行动。
现在小码会回答问题了,每个答案都是 True(真)或 False(假):
on_gem():我脚下有宝石吗?front_clear():前面一格是空的(没有墙)吗?at_goal():我在旗子上吗?
if on_gem():
pick()缩进的那一行只有答案是 True 时才会执行。再加上 else: 写「否则怎么做」:
if front_clear():
move()
else:
turn_left()定义
条件 Condition
A condition is an expression whose value is True or False; an if statement runs its block only when the condition is True.条件是一个值为 True 或 False 的表达式;if 语句只在条件为 True 时执行它的代码块。
布尔值 Boolean
A Boolean is a value that is either True or False.布尔值就是 True 或 False 这两个值之一。
示例
有宝石才捡
在互动课里运行不管宝石在哪,这段代码都能用。练习里会用别的地图来测试它。
for i in range(7):
move()
if on_gem():
pick()逐步执行
- L2走一格。
- L3问:脚下有宝石吗?这里答案是 False,跳过第 4 行。
on_gem() → False - L3下一轮,走到宝石格:True。
on_gem() → True - L4这时才执行 pick()。
遇墙就转
在互动课里运行if ... else 每一轮都在两个动作里选一个。
for i in range(5):
if front_clear():
move()
else:
turn_left()逐步执行
- L2前面是空的:True。
front_clear() → True - L3所以小码走一格。(跳过 else 部分。)
- L2到了拐角,前面是墙:False。
front_clear() → False - L5所以执行 else 部分:左转。
- L3面朝上,前面又空了:再走两步到旗子。
常见错误
问问题时忘了括号
if on_gem:(没有括号)总是被当成真,因为你没有提问,只是提到了问题的名字。要写 if on_gem():。
else 后面也要冒号
else: 要和对应的 if 对齐,后面同样跟一个缩进的代码块。
小测验
1. on_gem() 会给出什么样的值?
查看答案
答案:A
这是一个「是 / 否」的问题,所以答案是布尔值 Boolean。
2. 小码最后停在哪里?
for i in range(3):
if on_gem():
pick()
move()查看答案
答案:B
检查发生在每次移动之前。最后一步走到第二颗宝石上时循环已经结束,没有人再检查了。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出每轮都做决定
预测结果。
- 改需求宝石随便放
这段程序假设每一格都有宝石。现在 3 张地图上的宝石位置都不一样,改成一段能在 3 张地图上都通关的程序。
- 从零写拐角在哪?
每张地图都是 L 形:先向东,再向上。拐角的位置每次都不同,路上可能有宝石,但路的总长度都是 6 格。写一段程序,3 张地图都要通关。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| if statement | if 语句 | A statement that runs a block only when its condition is True. |
| Condition | 条件 | An expression that is either True or False. |
| Boolean | 布尔值 | A value that is either True or False. |
| else | else 分支 | The block that runs when the if condition is False. |