第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > python 布尔值取反_如何在Python中获得布尔值的相反(否定)?

python 布尔值取反_如何在Python中获得布尔值的相反(否定)?

时间:2023-11-13 21:45:26

相关推荐

python 布尔值取反_如何在Python中获得布尔值的相反(否定)?

最好的方法可能是使用运算符not:>>> value = True

>>> not value

False

>>> value = False

>>> not value

True

所以不是你的代码:if bool == True:

return False

else:

return True

您可以使用:return not bool

作为函数的逻辑否定

在^{}模块^{}中还有两个函数,如果您需要它作为函数而不是运算符,它的别名是^{}:>>> import operator

>>> operator.not_(False)

True

>>> operator.not_(True)

False

如果要使用需要谓词函数或回调函数的函数,这些函数可能很有用。>>> lst = [True, False, True, False]

>>> list(map(operator.not_, lst))

[False, True, False, True]

>>> lst = [True, False, True, False]

>>> list(filter(operator.not_, lst))

[False, False]

当然,通过一个等价的lambda函数也可以实现同样的功能:>>> my_not_function = lambda item: not item

>>> list(map(my_not_function, lst))

[False, True, False, True]

不要对布尔值使用按位反转运算符~

人们可能倾向于使用按位反转运算符~或等效的运算符函数^{}(或其他3个别名中的一个)。但由于bool是int的子类,因此结果可能是意外的,因为它不返回“逆布尔值”,而是返回“逆整数”:>>> ~True

-2

>>> ~False

-1

这是因为True等价于1,而False等价于0,并且按位反转对整数1和0的按位表示进行操作。

所以这些不能用来“否定”abool。

用NumPy数组(和子类)求反

如果处理的是包含布尔值的NumPy数组(或像pandas.Series或pandas.DataFrame这样的子类),那么实际上可以使用逐位逆运算符(~)对数组中的所有布尔值求反:>>> import numpy as np

>>> arr = np.array([True, False, True, False])

>>> ~arr

array([False, True, False, True])

或等效的NumPy函数:>>> np.bitwise_not(arr)

array([False, True, False, True])

不能在NumPy数组上使用not运算符或operator.not函数,因为它们要求返回单个bool(不是布尔数组),但是NumPy还包含一个逻辑not函数,该函数按元素工作:>>> np.logical_not(arr)

array([False, True, False, True])

也可以应用于非布尔数组:>>> arr = np.array([0, 1, 2, 0])

>>> np.logical_not(arr)

array([ True, False, False, True])

自定义自己的类

not通过对值调用bool来工作,并否定结果。在最简单的情况下,truth value将只调用对象上的__bool__。

因此,通过在Python 2中实现^{}(或^{}),您可以定制真值,从而定制not的结果:class Test(object):

def __init__(self, value):

self._value = value

def __bool__(self):

print('__bool__ called on {!r}'.format(self))

return bool(self._value)

__nonzero__ = __bool__ # Python 2 compatibility

def __repr__(self):

return '{self.__class__.__name__}({self._value!r})'.format(self=self)

我添加了一个print语句,这样您就可以验证它是否真正调用了方法:>>> a = Test(10)

>>> not a

__bool__ called on Test(10)

False

同样,您可以实现^{}方法来实现应用~时的行为:class Test(object):

def __init__(self, value):

self._value = value

def __invert__(self):

print('__invert__ called on {!r}'.format(self))

return not self._value

def __repr__(self):

return '{self.__class__.__name__}({self._value!r})'.format(self=self)

再次调用print以查看它实际上是被调用的:>>> a = Test(True)

>>> ~a

__invert__ called on Test(True)

False

>>> a = Test(False)

>>> ~a

__invert__ called on Test(False)

True

然而,像这样实现__invert__可能会令人困惑,因为它的行为不同于“正常”的Python行为。如果你曾经做过清楚的记录,并确保它有一个很好的(和常见的)用例。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。