查看: 1327|回复: 1

[MicroPython] ESP32 / ESP8266 MicroPython教程:Lambda函数

[复制链接]

介绍
本MicroPython教程的目的是解释如何在MicroPython 中使用lambda函数,以及它们与常规函数的区别。本教程在 esp32 和 esp8266 上进行了测试。在 esp32 上的测试是使用 DFRobot 的esp-wroom-32设备集成在FireBeetle ESP32开发板上进行的。

Lambda是许多编程语言支持的一种概念,如JavaScript和C#,在更加正式的定义中,它们被称为匿名函数。
因此,在MicroPython中,我们无需使用典型的def结构(https://www.tutorialspoint.com/python/python_functions.htm)就能够定义运行函数。lambda函数用途广泛,其中一个特别重要的应用是作为参数传递给mapfilterreduce等列表函数。

下面所示的命令是在MicroPython IDE uPyCraft上执行的。你可以在之前的文章中了解更多:ESP32 MicroPython教程:uPyCraft IDE入门


也可以查看教程bellow的视频版本:





关于Lambda函数
我们将通过一个简单的示例来测试lambda函数,我们将使用lambda函数和一个具名函数对两个变量进行操作并实现相同的结果。
因此,我们首先定义一个函数,这个函数将对用户输入的两个数值进行求和。我们将使用def关键字定义这个函数,因此它将会是一个具名函数,我们将在随后的代码中使用这个函数。

[AppleScript] 纯文本查看 复制代码
1  lambda args: expression

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


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

[AppleScript] 纯文本查看 复制代码
1  def sum(x,y):
2  return (x+y)
3 
4  result = sum (4,5)
5  print(result)


图1显示了求和函数的定义代码及执行结果。
Figure 1 – Defining and executing a named function..png
图1 - 定义和执行一个具名函数

现在,我们将根据前面介绍的语法定义一个lambda函数。正如前面所述,函数的多个输入参数(x和y)应使用逗号隔离,并且不能使用括号。
接着,在冒号“:”之后写出两个参数求和的表达式。不管怎样,都不能使用return(返回值)语句,这是lambda函数的要求。

[AppleScript] 纯文本查看 复制代码
1 sumLambda = lambda x,y: x+y
2  
3 result = sumLambda(4,5)
4 print(result)


请注意,我们已经将lambda函数指定为一个变量,所以我们可以在随后为其赋予两个参数值。但这与前面的具名函数还是有所不同,因为如果我们释放了lambda变量(例如,我们将这个变量赋予了其它值),那么我们的lambda函数也将丢失,因为它不是一个具名函数。此外,在实际使用中,我们甚至不会将它赋予任何变量,因为我们只是简单地将它作为函数的输入参数使用,例如,用于前面所述的map、reduce和filter函数。
图2显示了lambda函数的执行结果,它与上述具名函数具有相同的执行结果。

Figure 2 – Defining and executing a lambda function..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)
他写了很多有关ESP32ESP8266的有用的教程和项目。

查看更多ESP32/ESP8266教程和项目,请点击 : ESP32教程汇总贴
英文版教程 ESP32 tutorial

gada888  版主

发表于 2019-1-10 12:17:09

好教程
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail