Truthy와 Falsy는 무엇입니까? 참 및 거짓과 어떻게 다릅니 까?


119

나는 파이썬에 정상 과 다른 TruthyFalsy 값 이 있다는 것을 알게되었습니다 .TrueFalse

누군가가 진실거짓 가치가 무엇인지 깊이 설명해 주 시겠습니까?

어디에서 사용해야합니까?

진실True가치, 거짓False가치 의 차이점은 무엇입니까 ?


20
경우 bool(value)의 결과 True, 다음 value입니다 truthy .
wnnmaw

4
당신이 그 단어를 직접 발명 했죠? 어쨌든, 참조 __nonzero____bool__
zvone 2010 년

6
Truthy / Falsy 값은 어떤 종류의 이진 테스트가 필요한 상황에서 편리합니다. 더 간단한 코드가 가능하며, 더 간단한 코드는 버그 가능성이 적고 읽기가 더 쉽습니다.
Mark Ransom

4
@zvone Truthy 및 falsy는 프로그래밍 언어에 부울 값이없는 경우 코드 골프에서 일반적으로 사용됩니다.
MilkyWay90

6
@zvone : 'Truthy'및 'Falsy'는 프로그래밍 언어를 비교할 때 널리 사용됩니다 (예 : PHP 대 PERL 대 Python 대 JS). (단지 코드 골프가 아닙니다).
smci

답변:


77

설명에서 설명했듯이 True 또는 False로 평가되는 값을 나타냅니다.

예를 들어 다음과 같이 확인하는 대신 목록이 비어 있지 않은지 확인합니다.

if len(my_list) != 0:
   print("Not empty!")

간단하게 다음과 같이 할 수 있습니다.

if my_list:
   print("Not empty!")

빈 목록과 같은 일부 값은 부울 값으로 평가 될 때 False로 간주되기 때문입니다. 비어 있지 않은 목록은 True입니다.

마찬가지로 정수 0의 경우 빈 문자열 ""등, False의 경우, 0이 아닌 정수, 비어 있지 않은 문자열 등의 경우 True입니다.

"진정한"및 "거짓"과 같은 용어의 개념은 단순히 위에서 설명한 것과 같은 경우에 참으로 간주되는 값과 거짓으로 간주되는 값을 나타냅니다.

예를 들어, 빈 목록 ( [])은 "허위"로 간주되고 비어 있지 않은 목록 (예 [1]:)은 "진정한"것으로 간주됩니다.

문서의이 섹션을 참조하십시오 .


아니면 my_list가 참이라면?

파이썬 셸에서 이러한 것들을 시도해보고 직접 확인하는 것이 좋습니다. ;) if my_list는 "my_list가 비어 있지 않은 경우"를 if not my_list의미하고 "my_list가 비어있는 경우"를 의미합니다.
B. 에클 스

1
좋아, 나는 마지막으로 약간의 혼란이있다. 나는 if a:이런 유형의 조건이 의미하는 것과 같은 많은 곳을 보았다 ? a가 참인지 아니면 거짓인지를 의미합니까? 또는 a가 진실인지 아니면 거짓인지를 의미합니까?

1
그것은 "만약 a가 참이면"을 의미합니다. 내 답변에서 설명하고 다른 사람들이 의견 및 기타 답변에서 설명했듯이 다른 사항은 참 또는 거짓으로 간주되지만 실제로는 그렇지 않습니다. 예를 들어 빈 목록은 False로 간주됩니다. 그래서 if []:절대 실행되지 않습니다.
B. Eckles 2016-10-11

a :는 a가 참 (정수 또는 문자열 일 때)이고 a :는 a가 빈 목록이거나 빈 dict 또는 거짓 값이면 거짓을 의미합니다!

200

"허위"인 다음을 제외하고 모든 값은 "진정한"것으로 간주됩니다.

  • None
  • False
  • 0
  • 0.0
  • 0j
  • Decimal(0)
  • Fraction(0, 1)
  • [] -빈 list
  • {} -빈 dict
  • () -빈 tuple
  • '' -빈 str
  • b'' -빈 bytes
  • set() -빈 set
  • 비어있는 range 처럼,range(0)
  • 대상
    • obj.__bool__() 보고 False
    • obj.__len__() 보고 0

"truthy"값은 if또는 while문에 의해 수행 된 검사를 충족합니다 . 우리는 차별화에 "truthy"와 "falsy을"사용 bool가치 TrueFalse.

진실 가치 테스트


5
좋은 목록, 감사합니다. 완전히 학문적 인 질문이지만 실행 순서가 무엇인지 알고 있습니까? bool 이 True를 반환하고 len 이 0을 반환하는 (또는 그 반대의 경우) 객체를 만들 수 있다고 생각했습니다 .
Hayden Crocker

16
@HaydenCrocker __bool__먼저 찾습니다 __len__. 둘 다 정의되지 않은 경우 모든 인스턴스가 "참"으로 간주됩니다. 이것은에 대한 문서에서 설명하는 object.__bool__방법
패트릭 Haugh을

3
3.5 이전의 Python 버전에서는 UTC 자정을 나타내는 시간 객체 가 False로 간주되었습니다. 이 문서에서는 문제에 대한 버그 보고서와 최종 해결 방법에 대한 개요를 제공합니다.
Jason V.

1
흥미롭게도 datetime 패키지의 경우 datetime.min은 진실이고 timedelta (0)는 거짓입니다.
David Kinghorn

1
@DavidKinghorn 그래도 말이 되죠? 최소 datetime 값은 다른 것과 같은 날짜 일 뿐이며 어떤 식 으로든 0과는 다릅니다. 대조적으로 timedelta(0)0과 같습니다. 자정을 나타내는 시간 값이 거짓이라는 것이 발견되었을 때이 문제가 발생하여 결국 수정되었습니다. lwn.net/Articles/590299
Patrick Haugh

5

참 값은 true 또는 false를 반환하는 부울 값이 아니라 부울 컨텍스트에서 사용되는 개체를 참조합니다.

>>> bool([])
False
>>> bool([1])
True
>>> bool('')
False
>>> bool('hello')
True

4

파이썬은 적용하여 진실성을 결정합니다. bool() 복귀 형으로 True또는 False같은 표현식에서 사용 if하거나while .

다음은 사용자 정의 클래스 Vector2d의 예이며 인스턴스가False 이며 크기 (벡터의 길이)가 0 일 때 되는 이고 그렇지 않으면 True.

import math
class Vector2d(object):
    def __init__(self, x, y):
        self.x = float(x)
        self.y = float(y)

    def __abs__(self):
        return math.hypot(self.x, self.y)

    def __bool__(self):
        return bool(abs(self))

a = Vector2d(0,0)
print(bool(a))        #False
b = Vector2d(10,0)    
print(bool(b))        #True

참고 : 정의하지 않았을 경우__bool__ 사용자 정의 클래스의 인스턴스는 기본적으로 진실로 간주되므로 항상 True를 반환합니다.

책의 예 : "Fluent in Python, 명확하고 간결하며 효과적인 프로그래밍"


2

Truthy 또는 Falsy 값은 어디에 사용해야합니까? 이것들은 통사론 적 설탕입니다 이므로 언제든지 피할 수 있지만 코드를 사용하면 코드를 더 읽기 쉽고 효율적으로 만들 수 있습니다. 또한, 파이썬이든 아니든 많은 코드 예제에서 찾을 수 있습니다. 좋은 방법으로 간주되기 때문입니다.

다른 답변에서 언급했듯이 if 테스트 및 while 루프에서 사용할 수 있습니다. 여기서 결합 기본값 파이썬 3 개의 다른 예 or, s문자열 변수 인이. 유사한 상황으로도 확장 할 수 있습니다.

진실없이

if len(s) > 0:
    print(s)
else:
    print('Default value')

진실로 더 간결합니다.

print(s or 'Default value')

파이썬 3.8에서는 할당 표현식을 활용할 수 있습니다. :=

진실없이

if len(s) == 0:
    s = 'Default value'
do_something(s)

진실로 그것은 너무 짧습니다

s or (s := 'Default value')
do_something(s)

또는 더 짧게,

do_something(s or (s := 'Default value'))

할당 식 없이는 할 수 있습니다

s = s or 'Default value'
do_something(s)

그러나 짧지는 않습니다. 어떤 사람들은 s =...라인이 만족스럽지 않다고 생각합니다.

if len(s)>0:
    s = s # HERE is an extra useless assignment
else:
    s = "Default value"

그럼에도 불구하고이 코딩 스타일에 익숙하다면 고수 할 수 있습니다.


-1
while 0:
    print("Inside the loop.", counter)
    counter -= 1
print("Outside the loop.", counter)

이 루프를 실행하면 while 0 : = while false :

0은 허위로 간주됩니다.


-2

Falsy는 빈 값 또는 None을 갖는 모든 데이터 유형으로서 빈 목록, 튜플과 같이 비어있는 것을 의미합니다. 진실한 의미 : 예외는 진실

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.