查看: 386|回复: 0

ESP32 / ESP8266 MicroPython:对列表使用map函数

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

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

    [LV.3]偶尔看看II

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


    介绍


    此MicroPython教程旨在解释如何使用map函数对MicroPython list列表进行操作。更多关于list列表及如何使用的信息,请阅读此前的教程:ESP32 / ESP8266 MicroPython教程:如何使用List列表

    Map函数有两个输入参数,第一个参数为一个映射函数,第二个参数为可迭代对象(例如,list列表 ),映射函数用于对可迭代对象的每个元素进行映射运算(https://docs.python.org/2/glossary.html#term-iterable)。Map函数的返回值为一个对象,这个对象可用于创建list列表或数组等(https://docs.python.org/3/tutorial/datastructures.html#sets)。值得注意的是,list列表仅仅是可迭代对象的一种。请查看Python编程语言中更多关于可迭代对象的信息(http://nvie.com/posts/iterators-vs-generators/)。


    虽然map函数的第一个参数可以是常规函数(通过def构造),但常用的lambda函数(匿名函数)是一种非常实用的工具,这在前面的教程(http://mc.dfrobot.com.cn/thread-274097-1-1.html)中已经详细介绍。正如我们即将看到的,lambda函数可以与map函数一起使用,让代码更容易编写且更加紧凑。



    在这个示例中,我们将对一个整数列表使用map函数进行映射,让list列表中的每个元素都增加1。这只是一个入门示例,这个函数可执行非常复杂的操作。


    这里的测试是在ESP8266和ESP32上进行的。 ESP32 上的测试使用了集成在 FireBeetle ESP32电路板上的DFRobot ESP-WROOM-32设备。本教程中的图像均取自在ESP8266上执行的测试。所有测试均在uPyCraft上进行,这是一种MicroPython IDE。更多关于uPyCraft(https://www.dfrobot.com/product-1590.html?tracking=5977b2a20858a)的信息,请查看之前的教程:ESP32 MicroPython教程:uPyCraft IDE入门


    使用lambda函数

    正如介绍章节所述,lambda函数是一种可配合map等函数使用的实用工具,它使我们能够定义本地映射函数,从而使代码更加紧凑和易于编写。

    我们将首先定义一个整数列表,这个列表将被用于执行映射操作。



    现在,我们将调用map函数,它的第一个输入参数是映射函数(在此示例中,我们将使用lambda函数作为映射函数),第二个输入参数为先前创建的list列表。正如之前的lambda函数教程:ESP32 / ESP8266 MicroPython教程:Lambda函数 所述,它们的语法如下所示:



    在此示例中,lambda函数只有一个参数(list列表的每个值,依次执行加1操作),所以它可以按照以下所示进行定义。



    因此,将lambda函数及list列表作为输入参数写入map函数中,我们将得到以下命令。请注意,我们还将打印出map函数返回值的类型,以此说明这个返回值已经不再是一个list列表,而是一个map对象,这个对象在随后可以被转换回list列表。

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

    1 mappedObject = map(lambda x: x+1, testList)
    2 print(type(mappedObject))
    


    为了将map对象转换回list列表,我们只需调用list函数并将返回的map对象作为其输入参数即可。

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

    1 mappedList = list(mappedObject)
    2 print(mappedList)


    以下图1显示了执行这些命令的结果。可以看出,返回的对象是一种map类数据,而不是我们传递的原始list列表类数据。尽管如此,在转换回list列表时,我们得到了预期的结果,即每个值都加1的list列表。


    图1 - 使用lambda函数执行map映射操作




    由于map操作在一开始很难理解,所以我们也可以通过其它方法获得相同的结果,如下所示。它的基本思路是,首先定义lambda函数,然后对初始list列表的每个元素进行迭代运算,将运算结果放置在另一个list列表中。注意,我们将使用Append方法在结果列表中追加元素。点击此处了解更多关于list列表方法的信息。

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

    1 testList = [1,2,3,4,5,6,7,8,9,10]
    2 finalList = []
    3 myLambda = lambda x: x+1
    4 
    5 for element in testList:
    6   finalList.append( myLambda(element) )
    7
    8 print(finalList)


    可以看出,这是一种非常繁冗且不简洁的方法。但不管怎样,它仍然得到了跟前面相同的结果,如图2所示。



    图2 - 采用其它方法获得与map函数相同的执行结果



    使用函数


    最后,我们将探讨如何将map函数与常规具名函数(而不是lambda函数)一起使用。
    因此,我们将首先定义一个名为increment的函数,该函数将把输入参数加1后返回。




    现在,正如先前所做的那样,我们只需简单地调用map函数,但这次我们将使用increment函数而非lambda函数作为其输入参数。

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

    1 testList = [1,2,3,4,5,6,7,8,9,10]
    2 resultList = list(map(increment, testList))
    3
    4 print (resultList)



    如图3所示,其输出结果与之前的结果相同。



    图3 - 使用具名函数映射list列表



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


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



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

    本版积分规则

    热门推荐

    Arduino lcd屏幕亮了但是不显示字符
    Arduino lcd屏幕亮了但是
    Arduino的lcd屏亮了但是上面没有字符显示,串进去的滑动变阻器也旋过了,但是还是没有
    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    [限时福利]5分钟带你快速了解新一代开发板:M5STACK
    [限时福利]5分钟带你快速
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    【Arduino】108种传感器模块系列实验(98)---L298N电机驱动板
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    两个ESP8266通过云端实现远程数据交互
    两个ESP8266通过云端实现
    原理简述:利用发布订阅模式。一个ESP8266作为消息发布者,另一个ESP8266作为消息订阅
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表