查看: 63|回复: 0

ESP32 / ESP8266 MicroPython教程:Lambda函数

[复制链接]
  • TA的每日心情

    2018-1-11 13:58
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2019-5-13 17:47 | 显示全部楼层 |阅读模式
    本帖最后由 dfrobot 于 2019-5-13 17:49 编辑

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

    Lambda是许多编程语言支持的一种概念,如JavaScript和C#,在更加正式的定义中,它们被称为匿名函数。
    因此,在MicroPython中,我们无需使用典型的def结构(mapreduce等列表函数。

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


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



    关于Lambda函数

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

    lambda args: expression


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


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


    kittenblock中小学创客名师推荐的图形化编程软件

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


    图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函数将成为一种非常实用的工具。
    就个人而言,我在使用C#及其出色的LINQ语法时(http://www.tutorialsteacher.com/linq/linq-method-syntax)已经开始使用lambda函数。刚开始时,使用lambda函数会让人感觉非常复杂且不必要,但随着时间的推移,您会发现它能够让您更容易地编写出更紧凑和简洁的代码。但需要注意的是,它会让不懂lambda语法的人难以读懂你的代码。


    注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。
    他写了很多有关ESP32、ESP8266的有用的教程和项目。

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

    打赏作者鼓励一下!
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    请问一下微动开关 4X4矩阵键盘 16按键  怎么接ardiuno的 接口?
    请问一下微动开关 4X4矩阵
    请问下这款微动开关 4X4矩阵键盘 16按键的 8个接口分别接单片机的什么口,我
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    Nano 一直显示上传,不显示上传成功。
    Nano 一直显示上传,不显
    前面用的还好好的,突然就传不上程序了。一直停留在上传状态中,就是不限显示上传成功
    【项目】基于Arduino Nano的多功能桌面感应垃圾桶
    【项目】基于Arduino Nano
    基于Arduino Nano的多功能桌面感应垃圾桶随着大学生活不断往前迈进,宿舍桌面上的杂物
    Arduino板接74HC拓展接驱动器接多个四项电机
    Arduino板接74HC拓展接驱
    一个Arduino板能不能接多个74HC595来得到多个拓展? 如果能的话要怎么接啊? 如果接
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表