Python重构过滤器并映射到列表理解
示例
的filter或map功能应经常列表理解来代替。GuidoVanRossum在2005年的一封公开信中很好地描述了这一点:
filter(P,S)几乎总是用来更清晰地写成,这具有巨大的优势,即最常见的用法是作为比较的谓词,例如,并且定义一个lambda只是需要读者付出更多的努力(加上lambda的速度比列表理解的速度慢))。更何况成为。当然,在许多情况下,您可以改为使用生成器表达式。[xforxinSifP(x)]x==42map(F,S)[F(x)forxinS]
以下代码行被视为“非pythonic”,并且会在许多pythonlinter中引发错误。
filter(lambda x: x % 2 == 0, range(10)) # even numbers < 10 map(lambda x: 2*x, range(10)) #每个数字乘以2 reduce(lambda x,y: x+y, range(10)) #列表中所有元素的总和
从前面的引言中学到的知识,我们可以将它们filter和map表达式分解为等效的列表理解;还从每个函数中删除了lambda函数-使代码在过程中更具可读性。
#过滤: #P(x)=x%2==0 #S=范围(10) [x for x in range(10) if x % 2 == 0] #映射 #F(x)=2*x #S=范围(10) [2*x for x in range(10)]
处理链接功能时,可读性变得更加明显。出于可读性考虑,一个映射或过滤器函数的结果应作为结果传递给下一个;在简单的情况下,可以用单个列表理解来代替。此外,我们可以轻松地从列表理解中看出我们的流程的结果是什么,在推理链式Map&Filter流程时,认知负载会更多。
#映射 & Filter filtered = filter(lambda x: x % 2 == 0, range(10)) results = map(lambda x: 2*x, filtered) #清单理解 results = [2*x for x in range(10) if x % 2 == 0]
重构-快速参考
映射
map(F,S)==[F(x)forxinS]
过滤
filter(P,S)==[xforxinSifP(x)]
其中F和P是分别转换输入值并返回a的函数bool