本帖最后由 dfrobot 于 2019-5-13 18:23 编辑
介绍
在这个示例中,我们将对一个整数列表使用map函数进行映射,让list列表中的每个元素都增加1。这只是一个入门示例,这个函数可执行非常复杂的操作。
使用lambda函数
正如介绍章节所述,lambda函数是一种可配合map等函数使用的实用工具,它使我们能够定义本地映射函数,从而使代码更加紧凑和易于编写。
我们将首先定义一个整数列表,这个列表将被用于执行映射操作。
[mw_shl_code=applescript,true]
1 testList = [1,2,3,4,5,6,7,8,9,10]
[/mw_shl_code]
[mw_shl_code=applescript,true]1 lambda args: expression[/mw_shl_code]
在此示例中,lambda函数只有一个参数(list列表的每个值,依次执行加1操作),所以它可以按照以下所示进行定义。
[mw_shl_code=applescript,true]1 lambda x: x+1[/mw_shl_code]
因此,将lambda函数及list列表作为输入参数写入map函数中,我们将得到以下命令。请注意,我们还将打印出map函数返回值的类型,以此说明这个返回值已经不再是一个list列表,而是一个map对象,这个对象在随后可以被转换回list列表。
[mw_shl_code=applescript,true]1 mappedObject = map(lambda x: x+1, testList)
2 print(type(mappedObject))
[/mw_shl_code]
为了将map对象转换回list列表,我们只需调用list函数并将返回的map对象作为其输入参数即可。
[mw_shl_code=applescript,true]1 mappedList = list(mappedObject)
2 print(mappedList)[/mw_shl_code]
以下图1显示了执行这些命令的结果。可以看出,返回的对象是一种map类数据,而不是我们传递的原始list列表类数据。尽管如此,在转换回list列表时,我们得到了预期的结果,即每个值都加1的list列表。
图1 - 使用lambda函数执行map映射操作
由于map操作在一开始很难理解,所以我们也可以通过其它方法获得相同的结果,如下所示。它的基本思路是,首先定义lambda函数,然后对初始list列表的每个元素进行迭代运算,将运算结果放置在另一个list列表中。注意,我们将使用Append方法在结果列表中追加元素。点击此处了解更多关于list列表方法的信息。
[mw_shl_code=applescript,true]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)[/mw_shl_code]
可以看出,这是一种非常繁冗且不简洁的方法。但不管怎样,它仍然得到了跟前面相同的结果,如图2所示。
图2 - 采用其它方法获得与map函数相同的执行结果
使用函数
最后,我们将探讨如何将map函数与常规具名函数(而不是lambda函数)一起使用。 因此,我们将首先定义一个名为increment的函数,该函数将把输入参数加1后返回。
[mw_shl_code=applescript,true]1 def increment (x):
2 return x+1[/mw_shl_code]
现在,正如先前所做的那样,我们只需简单地调用map函数,但这次我们将使用increment函数而非lambda函数作为其输入参数。
[mw_shl_code=applescript,true]1 testList = [1,2,3,4,5,6,7,8,9,10]
2 resultList = list(map(increment, testList))
3
4 print (resultList)[/mw_shl_code]
如图3所示,其输出结果与之前的结果相同。
图3 - 使用具名函数映射list列表
注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。 他写了很多有关ESP32、ESP8266的有用的教程和项目。
查看更多ESP32/ESP8266教程和项目,请点击 : ESP32教程汇总贴
|