शायद सबसे अच्छा तरीका ऑपरेटर का उपयोग कर रहा है not
:
>>> value = True
>>> not value
False
>>> value = False
>>> not value
True
इसलिए अपने कोड के बजाय:
if bool == True:
return False
else:
return True
आप उपयोग कर सकते हैं:
return not bool
फ़ंक्शन के रूप में तार्किक निषेध
operator
मॉड्यूल में भी दो कार्य हैं operator.not_
और यह उर्फ operator.__not__
के मामले में है जब आपको ऑपरेटर के बजाय फ़ंक्शन की आवश्यकता होती है:
>>> import operator
>>> operator.not_(False)
True
>>> operator.not_(True)
False
ये उपयोगी हो सकते हैं यदि आप एक फ़ंक्शन का उपयोग करना चाहते हैं जिसके लिए एक पेडीकैट-फ़ंक्शन या कॉलबैक की आवश्यकता होती है।
उदाहरण के लिए map
या 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]
बेशक एक समान lambda
कार्य के साथ भी प्राप्त किया जा सकता है :
>>> my_not_function = lambda item: not item
>>> list(map(my_not_function, lst))
[False, True, False, True]
~
बूलियन्स पर बिटवाइज़ इनवर्टर ऑपरेटर का उपयोग न करें
बिटवाइज इनवर्टर ऑपरेटर ~
या समकक्ष ऑपरेटर फ़ंक्शन operator.inv
(या अन्य 3 उपनामों में से एक) का उपयोग करने के लिए किसी को लुभाया जा सकता है । लेकिन क्योंकि परिणाम bool
का एक उपवर्ग int
अप्रत्याशित हो सकता है क्योंकि यह "उलटा बूलियन" वापस नहीं करता है, यह "उलटा पूर्णांक" लौटाता है:
>>> ~True
-2
>>> ~False
-1
के ऐसा इसलिए है क्योंकि True
के बराबर है 1
और False
करने के लिए 0
और बिटवाइज़ उलट की बिटवाइज़ प्रतिनिधित्व पर चल रही है पूर्णांकों 1
और 0
।
इसलिए इनका उपयोग "नकारात्मक" करने के लिए नहीं किया जा सकता है bool
।
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 में एक तार्किक नहीं फ़ंक्शन भी शामिल है जो तत्व-वार काम करता है:
>>> 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
मूल्य पर कॉल करके काम करता है और परिणाम को नकारता है। सबसे सरल मामले में सत्य मूल्य सिर्फ __bool__
ऑब्जेक्ट पर कॉल करेगा ।
तो लागू करके __bool__
(या __nonzero__
पायथन 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__
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
इसी तरह आप __invert__
लागू होने पर व्यवहार को लागू करने के लिए विधि को लागू कर सकते हैं ~
:
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__
करना भ्रामक हो सकता है क्योंकि यह व्यवहार "सामान्य" पायथन व्यवहार से अलग है। यदि आप कभी ऐसा करते हैं तो स्पष्ट रूप से दस्तावेज दें और सुनिश्चित करें कि इसका उपयोग बहुत अच्छा (और आम) उपयोग-मामला है।
int
औरbool
दोनों builtin नाम (प्रकार वे प्रतिनिधित्व के लिए), और चर नाम के रूप में नहीं किया जाना चाहिए।