파이썬에서 부울의 반대 (부정)를 어떻게 얻습니까?
다음 샘플의 경우 :
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
술어 함수 또는 콜백이 필요한 함수를 사용하려는 경우 유용 할 수 있습니다.
>>> 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 1
and False
to 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])
자신 만의 클래스 커스터마이징
not
bool
값 을 호출 하여 작동 하고 결과를 부정합니다. 가장 간단한 경우 진리 값 은 __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]
'developer tip' 카테고리의 다른 글
rails-여러 배열 사이의 교차점 찾기 (0) | 2020.11.07 |
---|---|
Android : 활동을 인스턴스화 할 수 없음 / ClassNotFoundException (0) | 2020.11.07 |
CodeIgniter의 머리글 및 바닥 글 (0) | 2020.11.07 |
브라우저에서 자바 스크립트를 통해 이미지를 압축하는 방법은 무엇입니까? (0) | 2020.11.07 |
glBindVertexArrays 대 glBindBuffer의 역할은 무엇이며 그 관계는 무엇입니까? (0) | 2020.11.07 |