Python重构过滤器并映射到列表理解

示例

的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