ESP32 / ESP8266 MicroPython教程:Lambda函数-Arduino中文社区 - Powered by Discuz! Archiver

dfrobot 发表于 2019-5-13 17:47

ESP32 / ESP8266 MicroPython教程:Lambda函数

本帖最后由 dfrobot 于 2019-5-13 17:49 编辑

介绍本MicroPython教程的目的是解释如何在MicroPython 中使用lambda函数,以及它们与常规函数的区别。本教程在 esp32 和 esp8266 上进行了测试。在 esp32 上的测试是使用 DFRobot 的esp-wroom-32设备集成在FireBeetle ESP32开发板上进行的。
Lambda是许多编程语言支持的一种概念,如JavaScript和C#,在更加正式的定义中,它们被称为匿名函数。因此,在MicroPython中,我们无需使用典型的def结构(map、reduce等列表函数。
下面所示的命令是在MicroPython IDE uPyCraft上执行的。你可以在之前的文章中了解更多:ESP32 MicroPython教程:uPyCraft IDE入门。
也可以查看教程bellow的视频版本:
http://v.qq.com/x/page/x08251mvxzf.html
关于Lambda函数我们将通过一个简单的示例来测试lambda函数,我们将使用lambda函数和一个具名函数对两个变量进行操作并实现相同的结果。因此,我们首先定义一个函数,这个函数将对用户输入的两个数值进行求和。我们将使用def关键字定义这个函数,因此它将会是一个具名函数,我们将在随后的代码中使用这个函数。
lambda args: expression


接下来,我们将定义一个lambda函数。为此,我们需要使用lambda关键字和相应的语法,如下所示。在lambda关键字之后,我们指定了lambda函数的参数,并在冒号“:”之后定义函数的表达式。当拥有多个参数时,我们需要使用逗号将其隔离。不管怎样,都不能将参数或表达式写在括号中,否则在MicroPython中将出现无效的语法错误。值得注意的是,在lambda函数的表达式中,我们不像常规函数那样使用return(返回值)语句。这是因为lambda函数只能包含表达式,return是一种语句。点击此处了解更多关于Python语言中表达式与语句差别的信息。

代码如前所述,在这个简单的示例中,我们将创建一个常规函数和一个lambda函数对两个数进行求和。我们可通过以下所示代码定义函数,这个函数将简单地接收两个输入的参数,并将其求和作为返回值。在定义了这个求和函数后,我们在随后的代码中就可以调用这个函数,如下所示。

1def sum(x,y):
2return (x+y)
3
4result = sum (4,5)
5print(result)

图1显示了求和函数的定义代码及执行结果。http://mc.dfrobot.com.cn/data/attachment/forum/201901/09/145006nxdpzehxylbzhfi0.png图1 - 定义和执行一个具名函数
现在,我们将根据前面介绍的语法定义一个lambda函数。正如前面所述,函数的多个输入参数(x和y)应使用逗号隔离,并且不能使用括号。接着,在冒号“:”之后写出两个参数求和的表达式。不管怎样,都不能使用return(返回值)语句,这是lambda函数的要求。
1 sumLambda = lambda x,y: x+y2 3 result = sumLambda(4,5)4 print(result)
请注意,我们已经将lambda函数指定为一个变量,所以我们可以在随后为其赋予两个参数值。但这与前面的具名函数还是有所不同,因为如果我们释放了lambda变量(例如,我们将这个变量赋予了其它值),那么我们的lambda函数也将丢失,因为它不是一个具名函数。此外,在实际使用中,我们甚至不会将它赋予任何变量,因为我们只是简单地将它作为函数的输入参数使用,例如,用于前面所述的map、reduce和filter函数。图2显示了lambda函数的执行结果,它与上述具名函数具有相同的执行结果。
http://mc.dfrobot.com.cn/data/attachment/forum/201901/09/145008oi639d73bp7iaxp9.png图2 - 定义和执行一个lambda函数
小结在此教程中,我们介绍了如何创建和执行一个lambda函数。注意,lambda函数是Python/MicroPython的高级功能,因此在入门教程中没有这部分内容是正常的。尽管不使用Lambda函数也可以容易地编程,但lambda函数提供了极佳的灵活性,是一个值得学习的概念。此介绍教程中的简单示例并未显示出它的实用性,但如果您需要花费很多时间编写map/reduce等函数,那么lambda函数将成为一种非常实用的工具。就个人而言,我在使用C#及其出色的LINQ语法时(http://www.tutorialsteacher.com/linq/linq-method-syntax)已经开始使用lambda函数。刚开始时,使用lambda函数会让人感觉非常复杂且不必要,但随着时间的推移,您会发现它能够让您更容易地编写出更紧凑和简洁的代码。但需要注意的是,它会让不懂lambda语法的人难以读懂你的代码。

注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。他写了很多有关ESP32、ESP8266的有用的教程和项目。
查看更多ESP32/ESP8266教程和项目,请点击 : ESP32教程汇总贴英文版教程 : ESP32 tutorial
页: [1]
查看完整版本: ESP32 / ESP8266 MicroPython教程:Lambda函数