【发布时间】:2017-07-22 13:23:27
【问题描述】:
python 布尔函数可以很容易地用 lambda 函数求反,但是对于如此基本的东西来说它有点冗长且难以阅读,例如:
def is_even(n):
return n % 2 == 0
odds_under_50 = filter(lambda x: not is_even(x), range(50))
我想知道标准库中是否有执行此操作的函数,可能如下所示:
odds_under_50 = filter(negate(is_even), range(50))
【问题讨论】:
-
据我所知,没有 builtin 函数,但您可以轻松地为此定义自己的高阶函数...
-
据我所知;在这种情况下,我只会使用列表理解:
[xi for xi in range(50) if not is_even(xi)] -
@Cleb: 不是 Python-3.x 中的
filter和这个列表理解是不等价的,因为filter是懒惰的:你可以filter一个无限的生成器,而你不能这样做列表理解。 -
@WillemVanOnsem:在实际中会有什么不同?在 cmets 中讨论可能会很棘手,但我目前看不出有什么区别。当我阅读documentation 时,我也没有发现区别(除了列表与迭代器)。
-
如果你
import itertools然后执行[xi for xi in itertools.repeat(1) if not is_even(xi)]这将耗尽内存。filter将延迟评估,因此根本不消耗 CPU/内存。