python 布尔值取反_如何在Python中获得布尔值的相反(否定)?
最好的方法可能是使用運(yùn)算符not:>>> value = True
>>> not value
False
>>> value = False
>>> not value
True
所以不是你的代碼:if bool == True:
return False
else:
return True
您可以使用:return not bool
作為函數(shù)的邏輯否定
在^{}模塊^{}中還有兩個(gè)函數(shù),如果您需要它作為函數(shù)而不是運(yùn)算符,它的別名是^{}:>>> import operator
>>> operator.not_(False)
True
>>> operator.not_(True)
False
如果要使用需要謂詞函數(shù)或回調(diào)函數(shù)的函數(shù),這些函數(shù)可能很有用。>>> 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]
當(dāng)然,通過(guò)一個(gè)等價(jià)的lambda函數(shù)也可以實(shí)現(xiàn)同樣的功能:>>> my_not_function = lambda item: not item
>>> list(map(my_not_function, lst))
[False, True, False, True]
不要對(duì)布爾值使用按位反轉(zhuǎn)運(yùn)算符~
人們可能傾向于使用按位反轉(zhuǎn)運(yùn)算符~或等效的運(yùn)算符函數(shù)^{}(或其他3個(gè)別名中的一個(gè))。但由于bool是int的子類(lèi),因此結(jié)果可能是意外的,因?yàn)樗环祷亍澳娌紶栔怠?#xff0c;而是返回“逆整數(shù)”:>>> ~True
-2
>>> ~False
-1
這是因?yàn)門(mén)rue等價(jià)于1,而False等價(jià)于0,并且按位反轉(zhuǎn)對(duì)整數(shù)1和0的按位表示進(jìn)行操作。
所以這些不能用來(lái)“否定”abool。
用NumPy數(shù)組(和子類(lèi))求反
如果處理的是包含布爾值的NumPy數(shù)組(或像pandas.Series或pandas.DataFrame這樣的子類(lèi)),那么實(shí)際上可以使用逐位逆運(yùn)算符(~)對(duì)數(shù)組中的所有布爾值求反:>>> import numpy as np
>>> arr = np.array([True, False, True, False])
>>> ~arr
array([False, True, False, True])
或等效的NumPy函數(shù):>>> np.bitwise_not(arr)
array([False, True, False, True])
不能在NumPy數(shù)組上使用not運(yùn)算符或operator.not函數(shù),因?yàn)樗鼈円蠓祷貑蝹€(gè)bool(不是布爾數(shù)組),但是NumPy還包含一個(gè)邏輯not函數(shù),該函數(shù)按元素工作:>>> np.logical_not(arr)
array([False, True, False, True])
也可以應(yīng)用于非布爾數(shù)組:>>> arr = np.array([0, 1, 2, 0])
>>> np.logical_not(arr)
array([ True, False, False, True])
自定義自己的類(lèi)
not通過(guò)對(duì)值調(diào)用bool來(lái)工作,并否定結(jié)果。在最簡(jiǎn)單的情況下,truth value將只調(diào)用對(duì)象上的__bool__。
因此,通過(guò)在Python 2中實(shí)現(xiàn)^{}(或^{}),您可以定制真值,從而定制not的結(jié)果: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)
我添加了一個(gè)print語(yǔ)句,這樣您就可以驗(yàn)證它是否真正調(diào)用了方法:>>> a = Test(10)
>>> not a
__bool__ called on Test(10)
False
同樣,您可以實(shí)現(xiàn)^{}方法來(lái)實(shí)現(xiàn)應(yīng)用~時(shí)的行為: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)
再次調(diào)用print以查看它實(shí)際上是被調(diào)用的:>>> a = Test(True)
>>> ~a
__invert__ called on Test(True)
False
>>> a = Test(False)
>>> ~a
__invert__ called on Test(False)
True
然而,像這樣實(shí)現(xiàn)__invert__可能會(huì)令人困惑,因?yàn)樗男袨椴煌凇罢!钡腜ython行為。如果你曾經(jīng)做過(guò)清楚的記錄,并確保它有一個(gè)很好的(和常見(jiàn)的)用例。
總結(jié)
以上是生活随笔為你收集整理的python 布尔值取反_如何在Python中获得布尔值的相反(否定)?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 10款3D桌面推荐,很不错哦
- 下一篇: 主梁弹性模量计算_简支梁计算方法