imap和ifilter与生成器推导式

0 投票
1 回答
1087 浏览
提问于 2025-04-17 02:22

我对一些不太重要的技术细节很感兴趣,比如这两者在Python内部是怎么表示的,有什么不同,性能方面又有什么差别之类的。

1 个回答

1

一般来说,使用 map 和 filter 这两个功能并不是很推荐,但如果你只用一个函数来同时做这两件事,它们还是有用的。不过,千万不要在 map 或 filter 中用 lambda 函数。想想看:

在以下情况下,使用 filter 或 map 更好:

(i for i in iterable if i), filter(bool, i)
(int(i) for i in iterable), map(int, i)

你看,这样更简单。但再考虑一下:

(i+3 for i in iterable), map(lambda i: i+3, iterable)
(i for i in iterable if i.isdigit()), filter(lambda i, i.isdigit(), iterable)

还有一个优点是,生成器表达式可以把 map 和 filter 的功能结合起来。

(f(i) for i in iterable if g(i)), map(f, filter(g, iterable))

对我来说,规则是:

  • 在 map 或 filter 中绝对不要用 lambda。
  • 只有在你做的事情很明显时,才使用 map 或 filter。
  • 对于其他情况,使用生成器表达式。
  • 如果不确定,就用生成器表达式。

编辑:

还有一件重要的事情忘了说:

在 Python 3 之前的版本中,map(和 filter)是“急切”的,也就是说它们会立即计算结果,所以最好和列表推导式比较一下。但在 Python 3 中,map 是“懒惰”的,它的行为就像生成器表达式一样。

撰写回答