developer tip

파이썬에서 부울의 반대 (부정)를 어떻게 얻습니까?

copycodes 2020. 11. 7. 10:16
반응형

파이썬에서 부울의 반대 (부정)를 어떻게 얻습니까?


다음 샘플의 경우 :

def fuctionName(int, bool):
    if int in range(...):
        if bool == True:
            return False
        else:
            return True

두 번째 if 문을 건너 뛸 수있는 방법이 있습니까? 부울의 반대를 반환하도록 컴퓨터에 지시하려면 bool?


다음을 사용할 수 있습니다.

return not bool

not연산자 (논리 부정)

아마도 가장 좋은 방법은 연산자를 사용하는 것입니다 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는 "inverse boolean"을 반환하지 않기 때문에 예기치 않은 결과가 될 수 있기 때문에 "inverse integer"를 반환합니다.

>>> ~True
-2
>>> ~False
-1

그 이유 True는 is 1and Falseto 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에는 요소별로 작동하는 논리 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])

자신 만의 클래스 커스터마이징

notbool을 호출 하여 작동 하고 결과를 부정합니다. 가장 간단한 경우 진리 값__bool__객체를 호출 합니다.

So by implementing __bool__ (or __nonzero__ in Python 2) you can customize the truth value and thus the result of 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)

I added a print statement so you can verify that it really calls the method:

>>> a = Test(10)
>>> not a
__bool__ called on Test(10)
False

Likewise you could implement the __invert__ method to implement the behavior when ~ is applied:

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)

Again with a print call to see that it is actually called:

>>> a = Test(True)
>>> ~a
__invert__ called on Test(True)
False

>>> a = Test(False)
>>> ~a
__invert__ called on Test(False)
True

However implementing __invert__ like that could be confusing because it's behavior is different from "normal" Python behavior. If you ever do that clearly document it and make sure that it has a pretty good (and common) use-case.


Python has a "not" operator, right? Is it not just "not"? As in,

  return not bool

If you are trying to implement a toggle, so that anytime you re-run a persistent code its being negated, you can achieve that as following:

try:
    toggle = not toggle
except NameError:
    toggle = True

Running this code will first set the toggle to True and anytime this snippet ist called, toggle will be negated.


You can just compare the boolean array. For example

X = [True, False, True]

then

Y = X == False

would give you

Y = [False, True, False]

참고URL : https://stackoverflow.com/questions/7030831/how-do-i-get-the-opposite-negation-of-a-boolean-in-python

반응형