本帖最后由 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等列表函数。
我们将通过一个简单的示例来测试lambda函数,我们将使用lambda函数和一个具名函数对两个变量进行操作并实现相同的结果。 因此,我们首先定义一个函数,这个函数将对用户输入的两个数值进行求和。我们将使用def关键字定义这个函数,因此它将会是一个具名函数,我们将在随后的代码中使用这个函数。
lambda args: expression
接下来,我们将定义一个lambda函数。为此,我们需要使用lambda关键字和相应的语法,如下所示。 在lambda关键字之后,我们指定了lambda函数的参数,并在冒号“:”之后定义函数的表达式。 当拥有多个参数时,我们需要使用逗号将其隔离。不管怎样,都不能将参数或表达式写在括号中,否则在MicroPython中将出现无效的语法错误。 值得注意的是,在lambda函数的表达式中,我们不像常规函数那样使用return(返回值)语句。 这是因为lambda函数只能包含表达式,return是一种语句[1]。点击此处了解更多关于Python语言中表达式与语句差别的信息。
代码 如前所述,在这个简单的示例中,我们将创建一个常规函数和一个lambda函数对两个数进行求和。我们可通过以下所示代码定义函数,这个函数将简单地接收两个输入的参数,并将其求和作为返回值。 在定义了这个求和函数后,我们在随后的代码中就可以调用这个函数,如下所示。
[mw_shl_code=arduino,true]1 def sum(x,y):
2 return (x+y)
3
4 result = sum (4,5)
5 print(result)[/mw_shl_code]
图1显示了求和函数的定义代码及执行结果。 图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函数的执行结果,它与上述具名函数具有相同的执行结果。
图2 - 定义和执行一个lambda函数
小结 在此教程中,我们介绍了如何创建和执行一个lambda函数。注意,lambda函数是Python/MicroPython的高级功能,因此在入门教程中没有这部分内容是正常的。 尽管不使用Lambda函数也可以容易地编程,但lambda函数提供了极佳的灵活性,是一个值得学习的概念。此介绍教程中的简单示例并未显示出它的实用性,但如果您需要花费很多时间编写map/reduce等函数,那么lambda函数将成为一种非常实用的工具。
注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。 他写了很多有关ESP32、ESP8266的有用的教程和项目。
查看更多ESP32/ESP8266教程和项目,请点击 : ESP32教程汇总贴
|