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行為。如果你曾經做過清楚的記錄,并確保它有一個很好的(和常見的)用例。
總結
以上是生活随笔為你收集整理的python 布尔值取反_如何在Python中获得布尔值的相反(否定)?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10款3D桌面推荐,很不错哦
- 下一篇: python下载小说