第 4 单元 方法

作者 易水 2025年06月19日 17:32 阅读 601

用于机器人技术的 Python第 4 单元 方法- 摘要预计完成时间:2 小时在这一单元中,你将学习一些更高级的工具,这些工具可以让你创建更复杂、更有趣的程序。具体来说,你将学习方法。- 摘要结束在本课程中,您已经经常使用方法。具体来说,您一直在调用方法,以便在模拟中控制机器人。不过,现在是时候学习更多关于方法的知识了。方法的概念是数学中最重要的概念之一。方法在计算机语言中的一个常见用法是实现数学方法。这种方法计算一个或多个结果,而这些结果完全由传给它的参数决定。从最一般的意义上讲,方法是编程语言中的一种结构元素,用于将一组语句组合起来,以便在程序中多次使用。如果没有方法,实现这一目标的唯一方法就是通过复制代码并将其调整到不同的上下文中,从而重复使用代码。使用方法通常能提高程序的可理解性和质量。它还能降低软件的开发和维护成本。4.1 定义Python 中的方法由一条 def语句来定义。一般

用于机器人技术的 Python


第 4 单元 方法

- 摘要

预计完成时间:2 小时

在这一单元中,你将学习一些更高级的工具,这些工具可以让你创建更复杂、更有趣的程序。具体来说,你将学习方法。

- 摘要结束

在本课程中,您已经经常使用方法。具体来说,您一直在调用方法,以便在模拟中控制机器人。不过,现在是时候学习更多关于方法的知识了。

方法的概念是数学中最重要的概念之一。方法在计算机语言中的一个常见用法是实现数学方法。这种方法计算一个或多个结果,而这些结果完全由传给它的参数决定。

从最一般的意义上讲,方法是编程语言中的一种结构元素,用于将一组语句组合起来,以便在程序中多次使用。如果没有方法,实现这一目标的唯一方法就是通过复制代码并将其调整到不同的上下文中,从而重复使用代码。使用方法通常能提高程序的可理解性和质量。它还能降低软件的开发和维护成本。

4.1 定义

Python 中的方法由一条 def语句来定义。一般语法如下

在 [ ] 中:


def mymethod():
   print ("Python")

正如您所看到的,这非常简单。您只需记住关键字 def.一旦创建了方法,就可以在程序的任何地方调用它。怎么调用?让我们来看看!

4.2 调用方法

要调用一个方法,只需指定该方法的名称,并在其后加上括号。请看下面的示例:

在 [ ] 中:


def mymethod():
   print ("The method mymethod() has been called")
   
mymethod()

如果在 Python 解释器中执行上述代码,会得到以下输出结果:

- 预期成果

>>> def mymethod():
...     print ("The method mymethod() has been called")
...
>>> mymethod()
The method mymethod() has been called
>>>

请记住,在 Python 解释器中,您必须按两次回车键才能告知后面的代码行没有缩进。

- 结束语 预期成果

4.3 方法参数

参数在方法名称之后、括号内指定。您可以添加任意数量的参数,只需用逗号分隔即可。请看下面的示例:

在 [ ] 中:


def add(a,b):
   res = a + b
   print (res)
   
add(2,2)

- 预期成果

>>> def add(a,b):
...     res = a + b
...     print (res)
...
>>> add(2,2)
4
>>>

- 结束语 预期成果

参数列表由一个或多个参数组成。如果方法被调用,参数被称为参数。方法主体由缩进语句组成。每次调用方法时,方法正文都会被执行。 参数可以是必须的,也可以是可选的。可选参数(通常称为默认参数)必须位于必选参数之后。

在上面的示例中,我们的方法有两个必选参数: ab.为什么它们是强制性的?因为如果我们不向方法提供这些参数,方法就无法完成它应该做的事(在本例中,就是添加参数)。

这些可选参数是什么?让我们来看看之前用过的例子,不过这次用的是可选参数:

在 [ ] 中:


def add(a=2,b=2):
   res = a + b
   print (res)
   
add()

- 预期成果

>>> def add(a=2,b=2):
...     res = a + b
...     print (res)
...
>>>
>>> add()
4
>>>

- 结束语 预期成果

请注意,这次我们调用方法时没有调用任何参数。这是因为对于可选参数(也称为默认参数),如果在调用方法时没有调用任何参数,它将调用括号内定义的默认参数。

如何连接新机器人

img

现在,您有了一个新机器人。要控制这个机器人,您只需向RobotControl 类提供正确的名称:

在 [ ] 中:


robotcontrol = RobotControl(robot_name="summit")

注意robot_name 是一个可选参数,默认为'turtlebot'

- 练习 4.1 -

a) 创建一个方法,在给定一个整数的情况下,使机器人在该时间内直线运动。例如,如果给定的数字是 5,机器人将直线运动 5 秒钟。

注:在本练习中,您可以使用 Python sleep()方法。要使用该方法,您只需导入 time模块,然后调用 sleep()方法,就像这样

在 [ ] 中:


import time

time.sleep(5) # This will make your program sleep for 5 seconds

- 练习 4.1 - 结束

- 练习 4.1 的解法

img

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

test_methods1.py

在 [ ] 中:


from robot_control_class import RobotControl
import time

robotcontrol = RobotControl(robot_name="summit")

def move_x_seconds(secs):
   robotcontrol.move_straight()
   time.sleep(secs)
   robotcontrol.stop_robot()


move_x_seconds(5)

- 习题 4.1 的最终解答 -

4.4 返回声明

在前面的章节中,每当我们调用方法时,它们总是返回某种值,对吗?然而,在我们迄今为止看到的示例中,我们的方法并没有返回任何值,不是吗?

因此,这清楚地告诉我们,return 语句并不是强制性的。无论如何,大多数方法都会返回某种值。让我们再次回顾add() 方法的示例,这次使用了返回语句:

在 [ ] 中:


def add(a=2,b=2):
   res = a + b
   return res
   
r = add(3,4)
print (r)

- 预期成果

>>> def add(a=2,b=2):
...     res = a + b
...     return res
...
>>> r = add(3,4)
>>> print (r)
7
>>>

- 结束语 预期成果

一个方法可以准确返回一个值,或者说一个对象。对象可以是一个数值,如整数或浮点数,但也可以是一个列表或字典(请记住 get_laser_full()方法)。因此,如果我们必须返回三个整数值,我们可以返回一个包含这三个整数值的 list 或 tuple。

在 [ ] 中:


def return_list():
   
   return [1, 2, 3]
           
l = return_list()
print (l[0])
print (l[1])
print (l[2])

- 预期成果

>>> def return_list():
...
...     return [1, 2, 3]
...
>>> l = return_list()
>>> print (l[0])
1
>>> print (l[1])
2
>>> print (l[2])
3
>>>

- 结束语 预期成果

- 练习 4.2 -

a) 创建一个新方法,获取 3 个整数(0 到 719 之间)作为参数。

b) 然后,该方法将调用 get_laser_summit()方法,使用整数作为参数,以获取每个整数对应的激光读数。

c) 最后,它将返回一个包含 3 个不同激光读数的列表。在该方法之外,您将打印这 3 个值。

重要提示:如您所见,我们引入了一个名为 get_laser_summit().该方法与 get_laser()方法完全相同,但它是为与 Summit XL 仿真一起工作而准备的(因为激光主题的名称不同)。

- 练习 4.2 - 结束

- 习题 4.2 的最终解答 -

img

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

test_methods2.py

在 [ ] 中:


from robot_control_class import RobotControl

robotcontrol = RobotControl(robot_name="summit")

def get_laser_values(a,b,c):
   r1 = robotcontrol.get_laser_summit(a)
   r2 = robotcontrol.get_laser_summit(b)
   r3 = robotcontrol.get_laser_summit(c)

   return [r1, r2, r3]

l = get_laser_values(0, 500, 1000)

print ("Reading 1: ", l[0])
print ("Reading 2: ", l[1])
print ("Reading 3: ", l[2])

- 习题 4.2 的最终解答 -

4.5 方法中的局部变量和全局变量

变量是定义它们的方法的局部变量。这意味着它们不能在方法之外使用。例如,请看下面的示例:

在 [ ] 中:


def f(): 
   lv = "Local Variable"

f()
print(lv)

如果执行上述代码,你认为会发生什么?理论上,应该会打印出字符串"本地变量"。让我们执行代码,看看会发生什么:

- 预期成果

>>> def f():
...     lv = "Local Variable"
...
>>> f()
>>> print(lv)
Traceback (most recent call last):
 File "", line 1, in
NameError: name 'lv' is not defined
>>>

- 结束语 预期成果

如您所见,我们遇到了一个错误。具体地说,它说:: name 'lv' is not defined.正如我们之前所说,变量 lv是在方法内部定义的,因此它是方法的局部变量。这意味着它不能在方法之外使用。

对于这种情况,Python 提供了全局变量。让我们来看一个例子:

在 [ ] 中:


def f():
   global gv
   gv = "Global Variable"

gv = "Empty"
print (gv)
f()
print(gv)

正如您所看到的,在调用方法之前,我们已经定义了变量 gv变量。然后,在方法内部,我们使用关键字 global.关键字 global关键字告诉 Python 这个变量是全局可用的。如果 gv 不存在,则创建 gv 并将其添加到全局变量列表中。如果 gv 已经存在,则将其值更新为"Global Variable"

- 预期成果

>>> def f():
...     global gv
...     gv = "Global Variable"
...
>>> gv = "Empty"
>>> print (gv)
Empty
>>> f()
>>> print(gv)
Global Variable
>>>

- 结束语 预期成果

4.6 我们再来玩玩机器人!

在下面的练习中,我们将介绍在 robot_control_class.py:

  • move_straight_time (motion, speed, time)

    :顾名思义,这个方法可以让机器人直线移动。您需要向它传递三个参数。

    • motion:在此指定您是想让机器人向前 ("forward") 或向后 ("backward").

    • speed:指定机器人的移动速度(米/秒)。

    • time:指定机器人移动的时间(以秒为单位)。

  • turn (clockwise, speed, time)

    :顾名思义,这个方法可以让您转动机器人。您需要向它传递三个参数。

    • clockwise:在这里指定您是想让机器人顺时针 ("clockwise") 还是逆时针 ("counter-clockwise").

    • speed:指定机器人的转动速度(米/秒)。

    • time:指定机器人转动的持续时间(秒)。

这两种方法都会返回一个字符串,表示它们执行的动作。

- 练习 4.3 -

a) 在 robot_control文件夹中,添加一个新的 Python 脚本,名为 test_methods3.py.

b) 在这个新文件中,对方法进行必要的调用,以便

  • 机器人以 0.3 米/秒的速度向前移动 5 秒钟

  • 以 0.3 弧度/秒的速度顺时针旋转机器人 7 秒钟

此外,在每个动作之后,打印该方法返回的字符串。

重要提示: 请记住,为了能够使用这些方法控制机器人,您需要做两件事。

  • 您必须导入 Python robot_control_class.py文件中的 Python 类。您可以使用下面一行(放在程序的顶部)来实现。

在 [ ] 中:


from robot_control_class import RobotControl
  • 您还必须创建该类的一个对象,才能调用这些方法。您可以用下面一行来实现:

在 [ ] 中:


robotcontrol = RobotControl(robot_name="summit")
  • 现在,您可以像这样调用该对象的方法:

在 [ ] 中:


robotcontrol.move_straight_time(necessary_parameters)

- 练习 4.3 - 结束

- 习题 4.3 的最终解答 -

img

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

test_methods3.py

在 [ ] 中:


from robot_control_class import RobotControl

robotcontrol = RobotControl(robot_name="summit")

robotcontrol.move_straight_time("forward", 0.3, 5)
robotcontrol.turn("clockwise", 0.3, 7)

- 习题 4.3 的最终解答 -

请注意,在最后这个练习中,我们引入了一个新概念,即Python 类。而这正是我们将在下一章讨论的主题!

- 练习 4.4 -

a) 创建一个新的 Python 脚本,使用前面练习中介绍的方法,帮助机器人进入带有红色标识的房间。

img

- 练习 4.4 - 结束

- 练习 4.4 的解法

img

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

重要提示:请记住,Summit XL 的旋转方式并不十分精确。这意味着本练习的解决方案并不精确。请不断尝试不同的组合,直到达到要求为止。

test_methods4.py

在 [ ] 中:


from robot_control_class import RobotControl

robotcontrol = RobotControl(robot_name="summit")

robotcontrol.turn("counter-clockwise", 0.3, 4)
robotcontrol.move_straight_time("forward", 0.3, 6)
robotcontrol.turn("counter-clockwise", 0.3, 4)
robotcontrol.move_straight_time("forward", 0.3, 7)

- 习题 4.4 的最终解答 -

4.7 单元测验提醒

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

下一单元结束时的课程项目下一步骤说明!


发表评论