Muhtemelen en iyi yol operatörü kullanmaktır not
:
>>> value = True
>>> not value
False
>>> value = False
>>> not value
True
Yani kodunuz yerine:
if bool == True:
return False
else:
return True
Kullanabilirsin:
return not bool
İşlev olarak mantıksal olumsuzlama
Orada iki işlev de vardır operator
modülü operator.not_
ve 's takma operator.__not__
durumda fonksiyonu olarak yerine operatör olarak ihtiyaç:
>>> import operator
>>> operator.not_(False)
True
>>> operator.not_(True)
False
Bir yüklem işlevi veya geri arama gerektiren bir işlevi kullanmak istiyorsanız, bunlar yararlı olabilir.
Örneğin map
veya filter
:
>>> 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]
Elbette aynı şey eşdeğer bir lambda
işlevle de elde edilebilir :
>>> my_not_function = lambda item: not item
>>> list(map(my_not_function, lst))
[False, True, False, True]
~
Boole'lerde bitsel ters çevirme operatörünü kullanmayın
Bitsel ters çevirme operatörünü ~
veya eşdeğer operatör fonksiyonunu operator.inv
(veya buradaki diğer 3 takma addan birini) kullanmak cazip gelebilir . Ancak sonucun bool
bir alt sınıfı olduğu int
için beklenmedik olabilir çünkü "ters boole" döndürmez, "ters tamsayı" döndürür:
>>> ~True
-2
>>> ~False
-1
Yıllardan Bunun nedeni True
eşdeğerdir 1
ve False
karşı 0
ve bitsel inversiyon bit cinsinden gösterimi çalışır tamsayılar 1
ve 0
.
Dolayısıyla bunlar a "yadsımak" için kullanılamaz bool
.
NumPy dizileriyle (ve alt sınıflarla) olumsuzluk
Eğer NumPy diziler ile ilgili (veya benzeri alt sınıfları ediyorsanız pandas.Series
ya pandas.DataFrame
içeren Boolean) aslında bitlerinin ters operatörü (kullanabilirsiniz ~
etkisiz hale getirmesine) bütün bir dizideki Boolean:
>>> import numpy as np
>>> arr = np.array([True, False, True, False])
>>> ~arr
array([False, True, False, True])
Veya eşdeğer NumPy işlevi:
>>> np.bitwise_not(arr)
array([False, True, False, True])
Sen kullanamaz not
operatörü veya operator.not
bunlar bu dönüş tek gerektirir çünkü NumPy diziler üzerinde fonksiyonunu bool
(değil boole dizisi) Ancak NumPy da öğeye göre çalışan bir mantıklı değildir işlevi içerir:
>>> np.logical_not(arr)
array([False, True, False, True])
Bu, boole olmayan dizilere de uygulanabilir:
>>> arr = np.array([0, 1, 2, 0])
>>> np.logical_not(arr)
array([ True, False, False, True])
Kendi sınıflarınızı özelleştirme
not
bool
değeri çağırarak ve sonucu olumsuzlayarak çalışır . En basit durumda, doğruluk değeri sadece __bool__
nesneyi çağırır .
Dolayısıyla __bool__
(veya __nonzero__
Python 2'de) uygulayarak doğruluk değerini ve dolayısıyla sonucunu özelleştirebilirsiniz 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__
def __repr__(self):
return '{self.__class__.__name__}({self._value!r})'.format(self=self)
print
Gerçekten yöntemi çağırdığını doğrulayabilmeniz için bir ifade ekledim :
>>> a = Test(10)
>>> not a
__bool__ called on Test(10)
False
Aynı şekilde , uygulandığında __invert__
davranışı uygulamak için yöntemi de uygulayabilirsiniz ~
:
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)
Yine print
, aslında çağrıldığını görmek için bir telefonla:
>>> a = Test(True)
>>> ~a
__invert__ called on Test(True)
False
>>> a = Test(False)
>>> ~a
__invert__ called on Test(False)
True
Ancak __invert__
böyle bir uygulama kafa karıştırıcı olabilir çünkü davranışı "normal" Python davranışından farklıdır. Bunu açıkça yaparsanız, bunu açıkça belgeleyin ve oldukça iyi (ve yaygın) bir kullanım durumu olduğundan emin olun.
int
vebool
(temsil ettikleri türleri için) hem yerleşik isimler ve değişken adı olarak kullanılmamalıdır.