ESP32 / ESP8266 MicroPython教程:对列表使用filter函数-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2436|回复: 0

ESP32 / ESP8266 MicroPython教程:对列表使用filter函数

[复制链接]
发表于 2019-5-13 17:51 | 显示全部楼层 |阅读模式

本MicroPython教程的目的是解释如何在MicroPython 中使用使用带有列表的过滤器函数。本教程在 esp32 和 esp8266 上进行了测试。在 esp32 上的测试是使用 DFRobot 的esp-wroom-32设备集成在FireBeetle ESP32开发板上进行的。

介绍

filter函数有两个输入参数,第一个参数是一个判断函数,第二个参数是一个可迭代对象(在此教程中为一个list列表),它将把迭代对象的每个元素传递给判断函数,然后仅输出判断函数的返回值为True的元素。
因此,我们必须在判断函数中定义返回True或False的条件。在如下的简单示例中,当数值大于5时,判断函数将返回True,否则将返回False。因此,对于一个含有多个整数的初始列表,在使用filter函数过滤后,将产生一个元素全部大于5的整数列表。


使用lambda函数
正如之前教程所述,lambda函数可以很好地在这类函数中使用,因此我们将在filter函数中使用lambda函数。首先,我们需要声明一个整数list列表,作为filter函数的输入参数。

[mw_shl_code=applescript,true]
1  testList = [1,2,3,4,5,6,7,8,9,10][/mw_shl_code]

现在,我们将简单地调用filter函数,将lambda函数作为filter函数的过滤条件,并将此list列表作为迭代对象。
我们在之前已经介绍了lambda函数的语法,教程:ESP32 / ESP8266 MicroPython教程:Lambda函数,所以在以下代码中直接编写了所需的lambda函数。请注意,这个lambda函数有一个输入变量,它代表着每步中list列表的当前元素,冒号“:”之后的表达式用于判断数值是否大于阈值5,您也可以使用其它阈值。

[mw_shl_code=applescript,true]
1  lambda x: x>5
[/mw_shl_code]

请注意,表达式x>5将产生一个布尔值(True或False),因此我们不需要使用IF判断语句。您可以在MicroPython的命令行中输入以下命令予以验证,返回值应当分别为“False”和“True”。

[mw_shl_code=applescript,true]
1  3>5
2  7>5[/mw_shl_code]

完整的filter函数命令如下所示。注意,我们存储输出结果只是为了验证输出值不再是一个list列表,而是一个过滤器类对象。

[mw_shl_code=applescript,true]1  filteredResult = filter(lambda x: x>5 , testList)
2  print (type(filteredResult))[/mw_shl_code]
我们只需要将返回对象作为list函数的输入参数即可将其简单地转换为一个list列表。注意,我们可以通过内嵌的方式在调用filter函数的同一行完成这种转换。

[mw_shl_code=applescript,true]
1  finalList = list(filteredResult)
2  print(finalList)[/mw_shl_code]

图1显示了代码运行结果。可以看到,在初始list列表中,只有那些满足过滤条件的元素才能够成为最终输出结果的一部分。代码的初始部分还展示了“>”操作符不需要IF语句就能够返回布尔值。

图1 - 利用filter函数及lambda函数过滤list列表


如果我们想要采用传统的循环方式来实现此过滤操作,可能的解决方案如下所示。我们只是迭代整个list列表,如果当前元素满足条件,我们就把它放在结果中。尽管这种方式也可以实现相同的过滤功能,但它的语法非常冗长和不简洁。

注意,在IF判断条件中,例如此循环中的if判断条件,我们不需要将布尔值与True进行比较。因为lambda函数的输出值已经是一个布尔值,我们不需要编写“if filterLambda(element) == True”这样的语句,只需简单地编写“if filterLambda(element)”即可。

[mw_shl_code=applescript,true]1  testList = [1,2,3,4,5,6,7,8,9,10]
2  finalList = []
3
4  filterLambda = lambda x: x>5
5
6  for element in testList:
7  if filterLambda(element):
8  finalList.append(element)
9

10 print (finalList)[/mw_shl_code]


如图2所示,最终的输出结果与采用filter函数的输出结果相同。



图2 - 采用替代方式实现与filter函数相同的过滤结果。


使用具名函数
最后,我们将使用具名函数而非lambda函数作为filter函数的判断函数完成过滤功能。
我们首先定义一个名为isGreater的函数,待检验的数值将作为它的输入参数。如果数值大于5,那么它将返回True,否则返回False。同样,我们不需要使用IF语句进行判断。

[mw_shl_code=applescript,true]1 def isGreater(x):

2 return x>5[/mw_shl_code]

现在,我们只要简单地调用filter函数即可,将我们定义的具名函数而非lambda函数作为filter函数的第一个参数。

[mw_shl_code=applescript,true]1  testList = [1,2,3,4,5,6,7,8,9,10]
2
3  filteredList = list(filter(isGreater,testList))
4  print(filteredList)[/mw_shl_code]

如图3所示,它的返回值与前面采用其它方式的返回值相同。



图3 - 将具名函数作为filter函数的输入参数


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

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




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

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 14:51 , Processed in 0.070236 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表