8.2 논리 연산자 사용하기

이번에는 논리 연산자를 사용해보겠습니다. 논리 연산자는 and, or, not이 있는데 먼저 and입니다.

  • a and b
>>> True and True
True
>>> True and False
False
>>> False and True
False
>>> False and False
False
>>> 

and는 두 값이 모두 True라야 True입니다. 하나라도 False이면 False가 나옵니다.

이번에는 or입니다.

  • a or b
>>> True or True
True
>>> True or False
True
>>> False or True
True
>>> False or False
False

or는 두 값 중 하나라도 True이면 True입니다. 두 값이 모두 False라야 False가 되죠.

마지막으로 not입니다.

  • not x
>>> not True
False
>>> not False
True

not은 논릿값을 뒤집습니다. 그래서 not TrueFalse가 되고, not FalseTrue가 됩니다.

여기서 and, or, not 논리 연산자가 식 하나에 들어있으면 not, and, or 순으로 판단합니다.

>>> not True and False or not False
True

식이 꼬여 있어서 상당히 헷갈리죠? 가장 먼저 not Truenot False를 판단하여 False and False or True가 됩니다.

그다음에 False and False를 판단하여 False가 나와서 False or True가 되므로 최종 결과는 True가 됩니다.

not True and False or not False
False and False or True
False or True
True

이 식을 괄호로 표현하면 다음과 같은 모양이 됩니다.

>>> ((not True) and False) or (not False)
True

순서가 헷갈릴 때는 괄호로 판단 순서를 명확히 나타내 주는 것이 좋습니다.

8.2.1 논리 연산자와 비교 연산자를 함께 사용하기

그럼 조금 응용해서 논리 연산자와 비교 연산자를 함께 사용해보겠습니다.

>>> 10 == 10 and 10 != 5    # True and True
True
>>> 10 > 5 or 10 < 3        # True or False
True
>>> not 10 > 5              # not True
False
>>> not 1 is 1.0            # not False
True

비교 연산자로 비교한 결과를 논리 연산자로 다시 판단했습니다. 이때는 비교 연산자(is, is not, ==, !=, <, >, <=, >=)를 먼저 판단하고 논리 연산자(not, and, or)를 판단하게 됩니다(각 연산자의 판단 순서는 '47.2 연산자 우선순위' 참조).

이처럼 파이썬은 영어 문장과 흡사한 구조를 가지고 있어서 코드가 읽기 쉬운 것이 장점입니다(우리는 크게 와 닿지 않지만 아무래도 영어가 모국어인 사람들에게는 큰 장점이겠죠?).

지금까지 비교 연산자와 논리 연산자에 대해 알아보았습니다. 이들 연산자는 if, while 등의 조건식을 만들 때 자주 사용하므로 의미를 정확히 익혀 두는 것이 좋습니다.

참고 | 정수, 실수, 문자열을 불로 만들기

정수, 실수, 문자열을 불로 만들 때는 bool을 사용하면 됩니다. 이때 정수 1은 True, 0은 False입니다. 만약 문자열의 내용이 'False'라도 불로 만들면 True입니다. 문자열의 내용 자체는 판단하지 않으며 값이 있으면 True입니다.

bool(값)

>>> bool(1)
True
>>> bool(0)
False
>>> bool(1.5)
True
>>> bool('False')
True

즉, 정수 0, 실수 0.0이외의 모든 숫자는 True입니다. 그리고 빈 문자열 '', ""를 제외한 모든 문자열은 True입니다.

참고 | 단락 평가

논리 연산에서 중요한 부분이 단락 평가(short-circuit evalution)입니다. 단락 평가는 첫 번째 값만으로 결과가 확실할 때 두 번째 값은 확인(평가)하지 않는 방법을 말합니다. 즉, and 연산자는 두 값이 모두 참이라야 참이므로 첫 번째 값이 거짓이면 두 번째 값은 확인하지 않고 바로 거짓으로 결정합니다.

# 첫 번째 값이 거짓이므로 두 번째 값은 확인하지 않고 거짓으로 결정
print(False and True)     # False
print(False and False)    # False

or 연산자는 두 값 중 하나만 참이라도 참이므로 첫 번째 값이 참이면 두 번째 값은 확인하지 않고 바로 참으로 결정합니다.

# 첫 번째 값이 참이므로 두 번째 값은 확인하지 않고 참으로 결정
print(True or True)     # True
print(True or False)    # True

특히 파이썬에서 논리 연산자는 이 단락 평가에 따라 반환하는 값이 결정됩니다. True, False를 논리 연산자로 확인하면 True, False가 나왔는데, True and 'Python'의 결과는 무엇이 나올까요?

>>> True and 'Python'
'Python'

문자열 'Python'도 불로 따지면 True라서 True and True가 되어 True가 나올 것 같지만 'Python'이 나왔습니다. 왜냐하면 파이썬에서 논리 연산자는 마지막으로 단락 평가를 실시한 값을 그대로 반환하기 때문입니다. 따라서 논리 연산자는 무조건 불을 반환하지 않습니다.

다음과 같이 마지막으로 단락 평가를 실시한 값이 불이면 불을 반환하게 됩니다.

>>> 'Python' and True
True
>>> 'Python' and False
False

여기서는 문자열 'Python'True로 쳐서 and 연산자가 두 번째 값까지 확인하므로 두 번째 값이 반환됩니다. 만약 다음과 같이 and 연산자 앞에 FalseFalse로 치는 값이 와서 첫 번째 값 만으로 결과가 결정나는 경우에는 첫 번째 값이 반환됩니다.

>>> False and 'Python'
False
>>> 0 and 'Python'    # 0은 False이므로 and 연산자는 두 번째 값을 평가하지 않음
0

or 연산자도 마찬가지로 마지막으로 단락 평가를 실시한 값이 반환됩니다. 다음은 or 연산자에서 첫 번째 값만으로 결과가 결정되므로 첫 번째 값이 반환됩니다.

>>> True or 'Python'
True
>>> 'Python' or True
'Python'

만약 두 번째 값까지 판단해야 한다면 두 번째 값이 반환됩니다.

>>> False or 'Python'
'Python'
>>> 0 or False
False