一直走:while · 机器人闯关
不知道要重复几次时,怎么重复?
课程目录为什么需要它
for i in range(6) 需要知道 6 这个数。可是很多时候你并不知道:「一直走到墙为止」「一直走到旗子」。while 循环 while loop 只要条件为真就一直重复,所以无论路多长它都能适应。
直觉理解
「汤里还有疙瘩,就继续搅。」你不会去数搅了几下,而是看一眼、搅一下、再看一眼……一旦看到没疙瘩了就停。
while not at_goal():
move()每一轮 Python 都先问问题。not 会把答案反过来:小码还没到旗子时,not at_goal() 是 True。到了旗子它就变成 False,循环结束。
注意:如果循环体里没有任何东西能让条件变成 False,循环就永远停不下来,这叫死循环 Infinite loop。小码走太多步会自己停下,页面也会在几秒后自动停止运行。
定义
while 循环 while loop
A while loop repeats its body as long as its condition is True, checking the condition before every round.while 循环在条件为 True 时不断重复循环体,每一轮开始前都会检查条件。
死循环 Infinite loop
An infinite loop is a loop whose condition never becomes False, so it never stops.死循环是条件永远不会变成 False 的循环,所以它永远停不下来。
示例
一直走到旗子
在互动课里运行想象走廊变长或变短:代码都不用改。
while not at_goal():
move()逐步执行
- L1检查:在旗子上吗?不在,所以
not at_goal()是 True。at_goal() → False - L2走一格,再回去检查。
- L1……每次移动前都要检查……
- L1到了旗子:
not at_goal()是 False,循环结束。at_goal() → True
连续两个 while
在互动课里运行走到墙边,转身,再走到下一面墙。
while front_clear():
move()
turn_left()
while front_clear():
move()逐步执行
- L1前面空吗?空:继续向东走。
- L1到墙边答案变成 False:第一个循环结束。
- L3左转朝上。
- L4第二个循环:向上走,直到旗子上方的墙。
常见错误
停不下来的循环
while not at_goal(): turn_left() 从来不移动,条件永远不会变。确保循环体能让小码一步步接近「条件变成 False」。
以为只检查一次
条件在每一轮开始前都会检查,不只是第一次。
小测验
1. 小码最后停在哪里?
while front_clear():
move()查看答案
答案:A
每次移动之前都先检查前面。前面是墙时条件为 False,循环停止:不会撞墙。
2. while 循环什么时候检查条件?
查看答案
答案:A
检查、执行循环体、再检查……第一次检查为 False 时循环停止。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出停在宝石上
预测结果。
- 改需求任意长度
这个 for 循环只适用于正好 5 格长的走廊。改成
while,让它在 3 张地图上都能通关。 - 从零写未知的 L
每张地图都是大小不同的 L 形,路上有宝石。用
while写一段程序,在 3 张地图上都捡完宝石并走到旗子。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| while loop | while 循环 | A loop that repeats while its condition is True. |
| Infinite loop | 死循环 | A loop whose condition never becomes False, so it never stops. |
| not | not 取反 | An operator that turns True into False and False into True. |