2017-07-30 89 views
3

python是否有一个内置的语句或函数否定另一个函数?更具体地说:一个函数需要另一个函数fun(它返回布尔值)并返回一个函数,该函数是fun的否定副本。否定一个函数(功能)

其简单的创造:

def neg(fun): 
    def negfun(x): 
     return not fun(x) 
    return negfun 

用法示例:

In [1]: fun = lambda x: x < 3 

In [2]: filter(fun, range(8)) 
Out[2]: [0, 1, 2] 

In [3]: filter(neg(fun), range(8)) 
Out[3]: [3, 4, 5, 6, 7] 

也许这是一个坏榜样,试想过滤功能已经存在别的地方,你想用它。

我只是感到惊讶,我找不到更简单的方法...有一个吗?

+0

据我所知,不过你可以改进上面的代码。 –

+0

您可以使用'itertools.filterfalse'来否定'filter'结果。 – vaultah

+0

'不好(()'而不是'negfun()'有什么不好? –

回答

2

你想要做什么是构成not operatorfun

可悲的是,蟒蛇没有任何好“构图”功能,所以你必须自己把它包:

def compose(f, g): 
    return lambda x: f(g(x)) 

有了这个你可以写:

import operator 

def neg(func): 
    return compose(operator.not, fun) 

虽这么说,我觉得它更容易阅读无论你的代码,或者干脆利用拉姆达:

neg_func = lambda x: not fun(x) 
+0

我必须说我通常喜欢lambda表达式,但在这种情况下,我认为lambda解决方案的可读性较差。 – Johannes

+0

取决于具体情况,当然我们在上面定义了'neg',但是在一个实际的项目中它可能存在于其他文件中,它的作用并不十分明显。谁知道它是否否定了论证或结果,例如?使用lambda时,显而易见,我们并不是指'lambda x:fun(not x)'。伊莫这是一般的投票(因为lambda是丑陋的)。 –

相关问题