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
使用 funcy
或 toolz
'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.
一个 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
使用 funcy
或 toolz
'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.