다음 샘플의 경우 :
def fuctionName(int, bool):
if int in range(...):
if bool == True:
return False
else:
return True
두 번째 if 문을 건너 뛸 수있는 방법이 있습니까? 부울의 반대를 반환하도록 컴퓨터에 지시하려면 bool
?
다음 샘플의 경우 :
def fuctionName(int, bool):
if int in range(...):
if bool == True:
return False
else:
return True
두 번째 if 문을 건너 뛸 수있는 방법이 있습니까? 부울의 반대를 반환하도록 컴퓨터에 지시하려면 bool
?
if x == True:
작성해야합니다 if x:
.
답변:
다음을 사용할 수 있습니다.
return not bool
int in range (....)
비효율적입니다. 목록을 만든 다음 선형 검색을 수행합니다. 보다 나은 x in range(low, high)
입니다 low <= x < high
.
not None
False를 반환합니다. 적어도 나를 위해 그것은 내가 기대하는 것이 아닙니다. 나는 기대할 not None
수 None
있으므로 not
반환 값이있을 경우에도 부정 할 수 있습니다 None
. 파이썬에서 구현되는 방식은 실제로 먼저 부울이 있는지 확인해야합니다.
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와 배열 처리 (또는 같은 서브 클래스가있는 경우 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__
객체를 호출 합니다.
따라서 구현 __bool__
(또는 __nonzero__
Python 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__ # Python 2 compatibility
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__
그렇게 구현 하는 것은 동작이 "정상적인"Python 동작과 다르기 때문에 혼란 스러울 수 있습니다. 그렇게 한 적이 있다면 명확하게 문서화하고 꽤 좋은 (그리고 일반적인) 사용 사례가 있는지 확인하십시오.
toggle 을 구현하려는 경우 영구 코드를 다시 실행할 때마다 무효화되도록 할 수 있습니다.
try:
toggle = not toggle
except NameError:
toggle = True
이 코드를 실행하면 먼저 설정됩니다 toggle
에 True
언제이라는 조각 인도 표준시는 토글 부정 될 것이다.
여기에서 허용되는 대답은 주어진 시나리오에 가장 정확합니다.
일반적으로 부울 값을 단순히 반전시키는 것에 대해 궁금해했습니다. 여기에서 허용되는 솔루션은 하나의 라이너로 작동하고 다른 하나의 라이너도 작동합니다. 부울이라는 것을 알고있는 변수 "n"이 있다고 가정하면이를 반전하는 가장 쉬운 방법은 다음과 같습니다.
n = n is False
내 원래 해결책이었고 다음 질문에서 받아 들여진 대답 :
n = not n
후자는 더 분명하다,하지만 성능에 대해 궁금 통해 hucked timeit
- 그것은에서 밝혀 n = not n
부울 값을 반전 할 수있는 빠른 방법도 있습니다.
n is False
진실 테스트에 사용하지 마십시오 .
int
그리고bool
(이 나타내는 유형) 모두 내장의 이름은, 변수 이름으로 사용할 수 없습니다.