人人都能学编程
English 开始学习
课程 1 · 零基础入门第 7 课 / 共 10 课免费阅读

先看再走: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()
逐步执行
  1. L2走一格。
  2. L3问:脚下有宝石吗?这里答案是 False,跳过第 4 行。on_gem() → False
  3. L3下一轮,走到宝石格:True。on_gem() → True
  4. L4这时才执行 pick()。

if ... else 每一轮都在两个动作里选一个。

for i in range(5):
    if front_clear():
        move()
    else:
        turn_left()
逐步执行
  1. L2前面是空的:True。front_clear() → True
  2. L3所以小码走一格。(跳过 else 部分。)
  3. L2到了拐角,前面是墙:False。front_clear() → False
  4. L5所以执行 else 部分:左转。
  5. L3面朝上,前面又空了:再走两步到旗子。

常见错误

问问题时忘了括号

if on_gem:(没有括号)总是被当成真,因为你没有提问,只是提到了问题的名字。要写 if on_gem():。

else 后面也要冒号

else: 要和对应的 if 对齐,后面同样跟一个缩进的代码块。

小测验

1. on_gem() 会给出什么样的值?

  1. ATrue 或 False
  2. B宝石的数量
  3. C什么都没有
查看答案

答案:A

这是一个「是 / 否」的问题,所以答案是布尔值 Boolean。

2. 小码最后停在哪里?

for i in range(3):
    if on_gem():
        pick()
    move()
  1. A旗子上
  2. B在第二颗宝石上,但没捡
  3. C报错:这里没有宝石
查看答案

答案:B

检查发生在每次移动之前。最后一步走到第二颗宝石上时循环已经结束,没有人再检查了。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出每轮都做决定

    预测结果。

  2. 改需求宝石随便放

    这段程序假设每一格都有宝石。现在 3 张地图上的宝石位置都不一样,改成一段能在 3 张地图上都通关的程序。

  3. 从零写拐角在哪?

    每张地图都是 L 形:先向东,再向上。拐角的位置每次都不同,路上可能有宝石,但路的总长度都是 6 格。写一段程序,3 张地图都要通关。

在互动课里练这一课

打开互动课,这些例子都能直接改、直接运行,练习题提交马上判题。免费开始,不用注册。

互动课按顺序解锁:前面的课还没学,会先带你到课程地图。

本课术语

术语中文英文定义
if statementif 语句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.
elseelse 分支The block that runs when the if condition is False.