2017-07-30 87 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是醜陋的)。 –

相關問題