最好的方法可能是使用运算符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行为。如果你曾经做过清楚的记录,并确保它有一个很好的(和常见的)用例。