用于机器人技术的 Python第 3 单元 条件语句和循环- 摘要预计完成时间:2 小时在本单元中,你将学习一些更高级的工具,这些工具将使你能够创建更复杂、更有趣的程序。具体来说,你将学习条件语句和循环。- 摘要结束3.1 条件语句人生就是要做决定,不是吗?让我告诉你,编程也不例外!在编程中,决定是通过条件语句做出的,主要是以 if语句的形式。几乎所有你能找到或创建的 Python 程序都会包含一些 if 语句......至少,如果程序是为了有用和解决问题的话。在大多数情况下,决定取决于变量或算术表达式的值。这些表达式会被求值为布尔值 True或 False的布尔值:如果条件语句为 True,将执行一个操作。如果为 "假",则将采取其他操作。让我们想象一下下面的真实情况:如果机器人前方有一堵墙,距离超过 1 米,我就会让机器人停下来,以免撞坏。否则,我会继续让机器人前进
第 3 单元 条件语句和循环
- 摘要
预计完成时间:2 小时
在本单元中,你将学习一些更高级的工具,这些工具将使你能够创建更复杂、更有趣的程序。具体来说,你将学习条件语句和循环。
- 摘要结束
3.1 条件语句
人生就是要做决定,不是吗?让我告诉你,编程也不例外!在编程中,决定是通过条件语句做出的,主要是以 if语句的形式。几乎所有你能找到或创建的 Python 程序都会包含一些 if 语句......至少,如果程序是为了有用和解决问题的话。
在大多数情况下,决定取决于变量或算术表达式的值。这些表达式会被求值为布尔值 True或 False的布尔值:
如果条件语句为 True,将执行一个操作。
如果为 "假",则将采取其他操作。
让我们想象一下下面的真实情况:
如果机器人前方有一堵墙,距离超过 1 米,我就会让机器人停下来,以免撞坏。否则,我会继续让机器人前进!无论如何,我都会打印激光读数。
让我们把这一想法转换成流程图,试着更好地理解它:

上述流程图可能会产生这样一个 Python 脚本:
在 [ ] 中:
if wall_is_close:
stop_robot()
else:
keep_moving()
print_reading()
正如您所看到的,if 语句用于决定执行哪个代码块。如果第一个条件为 True,那么第 1 个代码块 (stop_robot()) 将被执行。如果为 False,则执行第 2 个代码块 (keep_moving()).在这两种情况下, print_reading()方法都将被执行。
在 Python 中,if 语句的最简单形式如下:
在 [ ] 中:
if condition:
statement
statement
# ... some more statements if necessary
3.2 块和缩进
您可能已经注意到,条件中的语句是缩进的。只有当 "条件 "被评估为 True 时,这些缩进的代码块才会被执行。
在 [ ] 中:
if condition:
# Indented statements
statement
statement
else:
# Indented statements
statement
statement
例如,下面的示例代码询问用户最喜欢的电影。只有当他最喜欢的电影是 "Avengers Endgame. "时,缩进的打印语句才会被执行,如果他说的是其他电影,则不会打印任何内容:
在 [ ] 中:
movie = input("What's your favorite movie? ")
if movie == "Avengers Endgame":
print("Good choice!")
在 robot_control文件夹中,新建一个 Python 脚本,名为 fav_movie.py的 Python 脚本,并将上面显示的代码复制到文件中。现在让我们执行该文件,看看会得到什么!
在 Shell #1 中执行
在 [ ] 中:
python fav_movie.py
如果您输入 Avengers Endgame作为您最喜欢的电影,您将得到以下信息:

总之,这个例子很糟糕,不是吗?如果我们的用户更喜欢浪漫的超级制作,他更喜欢 "Titanic",那会怎么样呢?那么,我们有一个好消息要告诉我们的朋友!在这种情况下,我们可以使用 or表达式。请看下面的示例:
在 [ ] 中:
movie = input("What's your favorite movie? ")
if movie == "Avengers Endgame" or movie == "Titanic":
print("Good choice!")
更新文件 fav_movie.py并再次执行!这一次,如果输入影片 Titanic就会得到如下结果:

但是,等等!如果我们的程序是由一个喜欢 "Star Wars"的小徒弟执行的呢?让我们再次更新代码:
在 [ ] 中:
movie = input("What's your favorite movie? ")
if movie == "Avengers Endgame" or movie == "Titanic":
print("Good choice!")
if movie == "Star Wars":
print("Also a good choice!")
更新文件 fav_movie.py并再次执行!这一次,如果输入影片 Star Wars就会得到如下结果:

但是,等等!这个新的 Python 脚本有一个缺点。假设您在执行代码时选择了 "Titanic"作为您最喜欢的电影。在这种情况下,正如你已经知道的,第一次打印将被执行。但在此之后,程序将继续检查第二个条件,而我们已经知道这是不可能的(因为用户已经选择了 "Titanic")。这意味着我们的程序将进行不必要的工作,而这正是我们一直希望避免的。那么......我们该如何解决这个问题呢?
使用 elif条件条件 elif条件只有在前一个条件被评估为 False.请看下面的示例:
在 [ ] 中:
movie = input("What's your favorite movie? ")
if movie == "Avengers Endgame" or movie == "Titanic":
print("Good choice!")
elif movie == "Star Wars":
print("Also a good choice!")
else:
print("You really are an interesting specimen")
更新文件 fav_movie.py并再次执行!这一次,如果你输入任何其他影片,都会得到如下结果:

如上例,if 语句通常包含 elif和 else分支。说得更准确些:可以有多个 "elif"分支,但只能有一个 "else" 分支。else 分支必须始终位于 if 语句的末尾。
因此,总结起来,Python 中 if 语句的一般形式是这样的:
在 [ ] 中:
if condition_1:
statement_block_1
elif condition_2:
statement_block_2
...
elif another_condition:
another_statement_block
else:
else_block
如果条件
condition_1为 True,程序块中的语句statement_block_1语句将被执行。如果没有、
condition_2将被评估。如果condition_2求值结果为True、statement_block_2将被执行。如果
condition_2为 "假",则将检查以下条件中的其他条件elif条件中的其他条件最后,如果它们都没有被求值为
True,则将执行关键字下面的缩进代码块。else关键字将被执行。
好了,有了正确的解释,现在让我们回到我们心爱的海龟机器人和我们心爱的练习!但在此之前,我们需要介绍两种新方法,你需要用它们来完成下面的练习:
move_straight():顾名思义,这种方法可以让机器人开始直线运动。stop_robot():顾名思义,这种方法可以让机器人停止移动。
现在让我们开始练习!
- 练习 3.1 -
a) 在机器人控制文件夹下新建一个 Python 脚本,命名为 test_if.py.
b) 在脚本中创建一个程序,重现上面显示的。
请记住,每次执行程序后都要重新设置机器人的位置!

- 练习 3.1 - 结束
- 练习 3.1 - 的预期结果
在 Web Shell 输出中,您应该会看到类似下面的内容:
[INFO] [1749726505.555878]: Robot Cooper...
[INFO] [1749726505.557580]: Checking Laser...
[INFO] [1749726505.649482]: Checking Laser...DONE
The laser value received was: inf
在模拟中,您应该能看到机器人是如何开始移动的,因为在脚本开始时,前方的距离大于 1 米(inf),直到它撞上走廊尽头的箱子。它只在开始时检查一次距离,这不是很聪明。

- 最终预期结果 -
- 练习 3.1 的解法

请尽量自己做,除非遇到困难或需要灵感。如果你能为每一个练习而奋斗,你会学到更多。
test_if.py
在 [ ] 中:
from robot_control_class import RobotControl
robotcontrol = RobotControl()
a = robotcontrol.get_laser(49)
if a < 3:
robotcontrol.stop_robot()
else:
robotcontrol.move_straight()
print ("The laser value received was: ", a)
- 习题 3.1 的最终解答 -
我相信大家都会同意,就目前的情况而言,您在上一个练习中创建的程序用处不大。至少,如果我们想让机器人避免撞墙的话。
出现这种情况的原因是,在我们的程序中,只有在执行程序时才会评估一次条件(距离墙壁是否超过 1 米?此时,墙壁距离我们超过了 1 米,所以我们告诉机器人开始向前移动。但是......之后会发生什么呢?当机器人开始向前移动时,墙壁越来越近。不幸的是,我们不再评估条件,因此无法检测到墙壁已经越来越近。
那么......我们怎样才能在程序中不断评估这个条件,从而检测到与墙壁的最新距离呢?好吧,让我向你介绍循环!
您想在 6 个月内从事机器人技术工作吗?机会就在这里。
了解更多信息:
3.3 循环
在许多情况下,当创建更复杂的程序时,需要重复评估一系列语句。例如,请看下面的流程图:

上述流程图可能会产生这样一个 Python 脚本:
在 [ ] 中:
while wall_is_not_closer_than_1meter:
keep_moving()
stop_robot()
在上面的流程图中,会反复检查条件。在本例中,我们要检查的条件是机器人前方是否有一堵不到 1 米的墙。如果没有,我们就必须不停地移动机器人,直到符合条件为止。只有当激光检测到小于 1 米的墙壁时(条件为 True),我们才能跳出循环。
Python 提供了两种不同类型的循环:循环 while循环和 for循环。
3.3.1 while 循环
这个概念可能有点令人困惑,所以我认为最好先看一个示例。在下面的脚本中,你将看到一个非常简单的 while 循环示例:
在 [ ] 中:
counter = 0
while counter < 10:
counter += 1
print (counter)
print ("Outside the loop!")
让我们测试一下,并启动我们的 Python 解释器:
在 [ ] 中:
python3
粘贴前两行代码:
在 [ ] 中:
counter = 0
while counter < 10:
然后记得在每个冒号后设置正确的缩进:
在 [ ] 中:
counter += 1
print (counter)
例如,在三个点之后按两次回车键... ,就可以不缩进地再写一行:
在 [ ] 中:
print ("Outside the loop!")执行上述脚本,看看会发生什么。
- 预期成果
>>> counter = 0
>>>
>>> while counter < 10:
... counter += 1
... print (counter)
...
...
1
2
3
4
5
6
7
8
9
10
>>> print ("Outside the loop!")
Outside the loop!
>>>
- 结束语 预期成果
基本上,上面的例子就是这样:
counter语句中的条件是counter < 10,即True,所以循环体执行。在循环体内部、
counter递增 1,然后打印出来。当循环体执行完毕后,程序返回循环顶端,再次评估条件。现在,
counter的值是 1,因此条件仍然是True,所以正文再次执行。这个过程一直持续到计数器变为 10。此时,当对条件进行评估时,结果是
False,因此循环终止。程序将从循环体后的第一条语句开始继续执行,即print("Outside the loop!")。
- 练习 3.2 -
a) 创建一个新的 Python 脚本,命名为 test_while.py.
b) 在脚本中创建一个程序,重现上面显示的。
- 练习 3.2 - 结束
- 练习 3.2 - 的预期结果
在 Web Shell 输出中,您应该会看到类似下面的内容:
[INFO] [1749736036.744887]: Robot Cooper...
[INFO] [1749736036.746193]: Checking Laser...
[INFO] [1749736036.812339]: Checking Laser...DONE
Current distance to wall: 11.208104
Current distance to wall: 10.502331
Current distance to wall: 9.735715
Current distance to wall: 9.042110
Current distance to wall: 8.275495
Current distance to wall: 7.557552
Current distance to wall: 6.815273
Current distance to wall: 6.109499
Current distance to wall: 5.415895
Current distance to wall: 4.673615
Current distance to wall: 3.894831
Current distance to wall: 3.225563
Current distance to wall: 2.458947
Wall is at 2.458947 meters! Stop the robot!
在模拟过程中,您应该看到机器人是如何开始移动的,因为最初它与前方障碍物的距离大于 3 米。然后,它继续移动,直到检测到距离低于 3 米的障碍物。在这种情况下,机器人就会停止前进。
您可以使用W, A, S, D重置模拟或移动机器人。

- 最终预期结果 -
- 习题 3.2 的最终解答 -

请尽量自己做,除非遇到困难或需要灵感。如果你能为每一个练习而奋斗,你会学到更多。
test_while.py
在 [ ] 中:
from robot_control_class import RobotControl
robotcontrol = RobotControl()
a = robotcontrol.get_laser(49)
while a > 3:
robotcontrol.move_straight()
a = robotcontrol.get_laser(49)
print ("Current distance to wall: %f" % a)
robotcontrol.stop_robot()
print ("Wall is at %f meters! Stop the robot!" % a)
- 习题 3.2 的最终解答 -
3.3.2 for 循环
for 循环用于对序列进行迭代。它可以遍历列表、字符串、字典的键和其他可遍历项。Python for 循环以关键字 for开头,后面是一个任意变量名,它将 Holded 被遍历的下面序列对象的值。一般语法如下
在 [ ] 中:
for variable in sequence:
statement
序列对象的项目一个接一个地分配给循环变量。然后,针对序列中的每个项,执行循环体。
请看下面的 Python 简单 for 循环示例:
在 [ ] 中:
names = ["Yoda", "ObiWan", "Anakin", "Palpatine"]
for x in names:
print(x)
- 预期成果
>>> names = ["Yoda", "ObiWan", "Anakin", "Palpatine"]
>>>
>>> for x in names:
... print(x)
...
Yoda
ObiWan
Anakin
Palpatine
>>>
- 结束语 预期成果
- 练习 3.3 -
a) 创建一个新的 Python 脚本,命名为 test_for.py
b) 首先,您将调用 get_laser_full()方法,以获取激光读数的完整列表。
c) 然后,您将创建一个 for 循环,遍历列表中的所有值,并计算出其中较高的值。
d) 最后,将此值打印给用户。
预期输出:
[INFO] [1749736625.721358]: Robot Cooper...
[INFO] [1749736625.722610]: Checking Laser...
[INFO] [1749736625.798327]: Checking Laser...DONE
The higher value in the list is: inf
- 练习 3.3 - 结束
- 习题 3.3 的最终解答 -

请尽量自己做,除非遇到困难或需要灵感。如果你能为每一个练习而奋斗,你会学到更多。
test_for.py
在 [ ] 中:
from robot_control_class import RobotControl
robotcontrol = RobotControl()
l = robotcontrol.get_laser_full()
maxim = 0
for value in l:
if value > maxim:
maxim = value
print ("The higher value in the list is: ", maxim)
- 习题 3.3 的最终解答 -
范围法
在使用 for表达式和 range()方法。请看下面的示例:
在 [ ] 中:
for i in range(5):
print (i)
- 预期成果
>>> for i in range(5):
... print (i)
...
0
1
2
3
4
>>>
- 结束语 预期成果
3.3.3 中断循环迭代
在您目前看到的每个示例中,每次迭代都会执行循环的整个主体。Python 提供了两个提前终止循环迭代的关键字:
break:立即完全终止循环。程序执行到循环体后的第一条语句。continue:立即终止当前循环迭代。执行将跳转到循环的顶端,并重新评估条件,以确定循环是再次执行还是终止。
请看下面的例子:
在 [ ] 中:
counter = 0
while counter < 10:
counter += 1
if counter == 3:
break
print (counter)
print ("Outside the loop!")
- 预期成果
>>> while counter < 10:
... counter += 1
... if counter == 3:
... break
... print (counter)
...
1
2
>>> print ("Outside the loop!")
Outside the loop!
>>>
- 结束语 预期成果
在 [ ] 中:
counter = 0
while counter < 10:
counter += 1
if counter == 3:
continue
print (counter)
print ("Outside the loop!")
- 预期成果
>>> counter = 0
>>>
>>> while counter < 10:
... counter += 1
... if counter == 3:
... continue
... print (counter)
...
1
2
4
5
6
7
8
9
10
>>> print ("Outside the loop!")
Outside the loop!
>>>
- 结束语 预期成果
3.4 测验提醒
点击页面左下角的右箭头按钮("转到下一单元")后,会出现以下窗口或类似窗口,其中包含一个测验:

如果由于某种原因没有显示,请告诉我们,我们会解决这个问题。
现在,是时候开始本课程的最终项目了!
该学院的每门课程都包含一个项目,必须通过应用课程所学知识来解决。
该项目将在一个不同的环境中完成,即ROS 开发工作室(ROSDS)。ROSDS是一个更接近于为公司机器人编程的环境。不过,它不像本学院那样具有指导性。
ROSDS已包含在您的订阅中,并集成在The Construct 中。因此,您无需付出额外的努力。不过,您需要付出一些额外的学习努力!不过,这也是您来到这里的原因!
要启动该项目,首先需要获取一份包含项目说明的ROS Project(ROSject)。请执行以下操作:
将项目 rosject 复制到您的ROSDS区域(请参阅下面的说明)。
获得ROSJECT后,请进入The Construct面板上的 "我的 Rosjects"区域。

单击在此课程 Rosject 上运行,打开 ROSJECT。

然后按照 Rosject 的指示完成项目的第一部分。
现在,您可以通过点击下面提供的链接来复制项目 Rosject。这将自动复制该项目。

发表评论