的filter或map功能应经常列表理解来代替。Guido Van Rossum在2005年的一封公开信中很好地描述了这一点:
filter(P, S)几乎总是用来更清晰地写成,这具有巨大的优势,即最常见的用法是作为比较的谓词,例如,并且定义一个lambda只是需要读者付出更多的努力(加上lambda的速度比列表理解的速度慢) )。更何况成为。当然,在许多情况下,您可以改为使用生成器表达式。[x for x in S if P(x)]x==42map(F, S)[F(x) for x in S]
以下代码行被视为“非pythonic ”,并且会在许多python linter中引发错误。
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) for x in S]
过滤
filter(P, S) == [x for x in S if P(x)]
其中F和P是分别转换输入值并返回a的函数bool