Python 否定布尔函数

Python negate boolean function

一个 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))

filter 的情况下,您可以使用 itertools 中的 ifilterfalse

据我所知,没有 内置 函数,也没有流行的库可以做到这一点。

尽管如此,您可以轻松地自己编写一个:

from functools import wraps

def negate(f):
    @wraps(f)
    def g(*args,**kwargs):
        return not f(*args,**kwargs)
    g.__name__ = f'negate({f.__name__})'
    return g

然后您可以使用:

odds_under_50 = filter(<b>negate(is_even)</b>, range(50))

negate 函数适用于给定函数的任意数量的参数:如果您定义了 is_dividable(x,n=2)。然后 negate(is_dividable) 是一个具有两个参数(一个可选)的函数,它也将接受这些参数。

您可以创建装饰器:

def negate(function):
    def new_function(*args, **kwargs):
       return not function(*args, **kwargs)
    return new_function


def is_even(x):
    return x % 2 == 0

print is_even(1)
print is_even(2)

is_odd = negate(is_even)
print is_odd(1)
print is_odd(2)

这个装饰器也可以和@negate一起使用。

@negate
def is_odd(x):
    return x % 2 == 0

使用 funcytoolz's compose 函数,您可以像这样取反函数:

import operator

import funcy

is_odd = funcy.compose(operator.not_, is_even)

如果你想让它更具可读性:

def negate(func):
    return funcy.compose(operator.not_, func)

is_odd = negate(is_even)

# or without creating the function directly
print(negate(is_even)(5))

funcy library has a lot of other useful functions for functional programming.