imap和ifilter与生成器推导式
我对一些不太重要的技术细节很感兴趣,比如这两者在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 是“懒惰”的,它的行为就像生成器表达式一样。