第 3 单元 条件语句和循环

作者 易水 2025年06月19日 17:30 阅读 610

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

用于机器人技术的 Python


第 3 单元 条件语句和循环

- 摘要

预计完成时间:2 小时

在本单元中,你将学习一些更高级的工具,这些工具将使你能够创建更复杂、更有趣的程序。具体来说,你将学习条件语句和循环。

- 摘要结束

3.1 条件语句

人生就是要做决定,不是吗?让我告诉你,编程也不例外!在编程中,决定是通过条件语句做出的,主要是以 if语句的形式。几乎所有你能找到或创建的 Python 程序都会包含一些 if 语句......至少,如果程序是为了有用和解决问题的话。

在大多数情况下,决定取决于变量或算术表达式的值。这些表达式会被求值为布尔值 TrueFalse的布尔值:

  • 如果条件语句为 True,将执行一个操作。

  • 如果为 "假",则将采取其他操作。

让我们想象一下下面的真实情况:

如果机器人前方有一堵墙,距离超过 1 米,我就会让机器人停下来,以免撞坏。否则,我会继续让机器人前进!无论如何,我都会打印激光读数。

让我们把这一想法转换成流程图,试着更好地理解它:


img


上述流程图可能会产生这样一个 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作为您最喜欢的电影,您将得到以下信息:

img

总之,这个例子很糟糕,不是吗?如果我们的用户更喜欢浪漫的超级制作,他更喜欢 "Titanic",那会怎么样呢?那么,我们有一个好消息要告诉我们的朋友!在这种情况下,我们可以使用 or表达式。请看下面的示例:

在 [ ] 中:


movie = input("What's your favorite movie? ")

if movie == "Avengers Endgame" or movie == "Titanic":
   print("Good choice!")

更新文件 fav_movie.py并再次执行!这一次,如果输入影片 Titanic就会得到如下结果:

img

但是,等等!如果我们的程序是由一个喜欢 "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就会得到如下结果:

img

但是,等等!这个新的 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并再次执行!这一次,如果你输入任何其他影片,都会得到如下结果:

img

如上例,if 语句通常包含 elifelse分支。说得更准确些:可以有多个 "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求值结果为Truestatement_block_2将被执行。

  • 如果 condition_2为 "假",则将检查以下条件中的其他条件 elif条件中的其他条件

  • 最后,如果它们都没有被求值为True ,则将执行关键字下面的缩进代码块。 else关键字将被执行。

好了,有了正确的解释,现在让我们回到我们心爱的海龟机器人和我们心爱的练习!但在此之前,我们需要介绍两种新方法,你需要用它们来完成下面的练习:

  • move_straight():顾名思义,这种方法可以让机器人开始直线运动。

  • stop_robot():顾名思义,这种方法可以让机器人停止移动。

现在让我们开始练习!

- 练习 3.1 -

a) 在机器人控制文件夹下新建一个 Python 脚本,命名为 test_if.py.

b) 在脚本中创建一个程序,重现上面显示的流程图

请记住,每次执行程序后都要重新设置机器人的位置!

img

- 练习 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),直到它撞上走廊尽头的箱子。它只在开始时检查一次距离,这不是很聪明。

img

- 最终预期结果 -

- 练习 3.1 的解法

img

请尽量自己做,除非遇到困难或需要灵感。如果你能为每一个练习而奋斗,你会学到更多。

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 个月内从事机器人技术工作吗?机会就在这里。

了解更多信息:Roboticsdeveloper.ai

img

3.3 循环

在许多情况下,当创建更复杂的程序时,需要重复评估一系列语句。例如,请看下面的流程图:


img


上述流程图可能会产生这样一个 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重置模拟或移动机器人。

img

- 最终预期结果 -

- 习题 3.2 的最终解答 -

img

请尽量自己做,除非遇到困难或需要灵感。如果你能为每一个练习而奋斗,你会学到更多。

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 的最终解答 -

img

请尽量自己做,除非遇到困难或需要灵感。如果你能为每一个练习而奋斗,你会学到更多。

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 测验提醒

点击页面左下角的右箭头按钮("转到下一单元")后,会出现以下窗口或类似窗口,其中包含一个测验:

img


如果由于某种原因没有显示,请告诉我们,我们会解决这个问题。

现在,是时候开始本课程的最终项目了!

该学院的每门课程都包含一个项目,必须通过应用课程所学知识来解决。

该项目将在一个不同的环境中完成,即ROS 开发工作室(ROSDS)ROSDS是一个更接近于为公司机器人编程的环境。不过,它不像本学院那样具有指导性。

ROSDS已包含在您的订阅中,并集成在The Construct 中。因此,您无需付出额外的努力。不过,您需要付出一些额外的学习努力!不过,这也是您来到这里的原因!

要启动该项目,首先需要获取一份包含项目说明的ROS Project(ROSject)。请执行以下操作:

  1. 将项目 rosject 复制到您的ROSDS区域(请参阅下面的说明)。

  1. 获得ROSJECT后,请进入The Construct面板上的 "我的 Rosjects"区域。

img

  1. 单击在此课程 Rosject 上运行打开 ROSJECT

img

  1. 然后按照 Rosject 的指示完成项目的第一部分

现在,您可以通过点击下面提供的链接来复制项目 Rosject。这将自动复制该项目。

在尝试本课程的下一单元之前,您应完成 ROSject 的第一部分


发表评论