본문으로 건너뛰기

참과 거짓, 비교

파이썬 목차조건레슨 14 / 59

목차

비교 연산자(comparison operator)는 두 값을 견주어 True(참)나 False(거짓) 값 하나를 만듭니다. 나이가 20 이상인지, 고른 메뉴가 커피인지처럼 '그런가?'를 묻는 일은 모두 비교로 시작합니다.

지금까지 만든 프로그램은 위에서 아래로 모든 줄을 실행했습니다. 다음 레슨의 if는 조건에 따라 실행할 줄을 고르는데, 그 조건이 비교가 만든 True·False입니다. 비교식도 대입문의 오른쪽처럼 그 줄이 실행될 때 한 번 계산되어 값 하나로 접힙니다.

이 단원(조건)을 이미 안다면 단원 연습 문제부터 풀고 틀린 레슨만 보세요.

6단계 중 1단계. 1번 줄: age를 18에 붙입니다.

1비교식은 True나 False로 접힌다

age >= 20은 'age가 20 이상인가?'를 묻는 식입니다. 이 줄이 실행되면 먼저 이름 age 자리에 그 이름이 지금 붙어 있는 값이 들어가고(18 >= 20), 그 값을 견주어 False 하나로 접힙니다. 그래서 같은 식이라도 실행하는 때의 값에 따라 결과가 다릅니다.

age = 18
print(age >= 20)
age = 25
print(age >= 20)
실행 결과
False
True

두 값이 같고 다른지, 크고 작은지 견주는 비교 연산자는 여섯입니다. age가 18일 때 식마다의 값을 함께 적었습니다.

연산자묻는 것age가 18일 때
==같은가age == 18 → True
!=다른가age != 18 → False
<왼쪽이 작은가age < 20 → True
>왼쪽이 큰가age > 20 → False
<=왼쪽이 작거나 같은가age <= 18 → True
>=왼쪽이 크거나 같은가age >= 20 → False

True와 False는 첫 글자가 대문자인 값이고, 종류 이름은 bool입니다. 참과 거짓 둘뿐인 이 값을 불리언(Boolean)이라고 부르고, 자료에 따라 논리값이라고도 부릅니다. 비교의 결과도 값이라서 이름을 붙일 수 있습니다.

age = 18
adult = age >= 20
print(adult)
print(type(adult))
실행 결과
False
<class 'bool'>

2번 줄에서는 오른쪽 age >= 20이 먼저 False로 접히고, 그 값에 이름 adult가 붙습니다. 대입의 규칙 그대로입니다(규칙 2). adult처럼 True·False 하나에 붙인 이름은 다음 레슨부터 조건 자리에 그대로 씁니다.

2=는 이름을 붙이고 ==는 묻는다

수학에서 =는 '같다'이지만 파이썬의 =는 대입입니다. 오른쪽 값에 왼쪽 이름을 붙입니다. '같은가?'를 묻는 것은 == 연산자이고, 묻기만 할 뿐 이름을 붙이지 않습니다.

쓴 것읽는 법하는 일
x = 7x를 7에 붙인다이름 x가 7을 가리킨다
x == 7x가 7과 같은가?True나 False를 만든다

아래 코드는 무엇을 찍을까요? 답을 정한 뒤 펼쳐 보세요.

x = 5
x == 7
print(x)
실행 결과 보기
실행 결과
5

예상과 다르면 그곳이 배울 곳입니다. 2번 줄 x == 7은 'x가 7과 같은가?'를 물어 False를 만들고, 그 값에 아무 이름도 붙이지 않은 채 버립니다. x를 7에 붙이는 줄은 x = 7입니다(규칙 2).

if 줄에 == 대신 =를 쓰면 오류가 나는데, 다음 레슨에서 봅니다.

3글자는 첫 글자부터 견준다

문자열끼리도 견줄 수 있습니다. == 연산자는 빈칸 하나까지 글자가 모두 같아야 True입니다. 크기 비교(<·> 등)는 사전처럼 첫 글자부터 하나씩 견주다가, 처음 다른 글자에서 답을 정합니다. 한글은 가나다 차례, 영어는 알파벳 차례로 앞에 오는 글자가 작습니다(영어 대문자는 소문자보다 앞입니다).

print('커피' == '커피')
print('라테' < '커피')
print('10' < '9')
실행 결과
True
True
True

'10' < '9'는 수 10과 9를 견주는 식이 아닙니다. 첫 글자 '1'과 '9'를 견주고, '1'이 앞이라 둘째 글자 '0'은 보지도 않고 True입니다. 따옴표 없이 수로 견주는 10 < 9는 False입니다.

4글자와 수는 크기를 견줄 수 없다

input()이 돌려주는 값은 늘 문자열입니다. 그 값을 수 20과 견주면 어떻게 될까요? 20을 넣고 돌린 결과입니다.

age = input('나이: ')
print(age == 20)
print(age < 20)넣는 값20
실행 결과
나이: 20FalseTraceback (most recent call last):  File "main.py", line 3, in <module>    print(age < 20)          ^^^^^^^^TypeError: '<' not supported between instances of 'str' and 'int'

오류 메시지는 맨 아래 줄부터 읽습니다. TypeError는 값의 종류가 맞지 않는다는 오류입니다. 뒤의 설명은 '< 연산자는 str(문자열)과 int(정수) 사이에서 쓸 수 없다(not supported)'는 뜻입니다. 실행은 3번 줄에서 멈췄습니다.

2번 줄 age == 20은 오류 없이 False였습니다. 글자와 수는 같을 수 없기 때문입니다. 이쪽이 더 조심할 곳입니다. 오류가 나지 않으니 틀린 줄을 모르고 지나갑니다. 수와 견주려면 받은 글자를 int()로 바꿉니다.

age = int(input('나이: '))
print(age == 20)
print(age < 20)넣는 값20
실행 결과
나이: 20
True
False

이제는 수끼리 견줍니다. 수끼리는 종류가 달라도 값으로 견주어, 정수 3과 실수 3.0도 3 == 3.0이 True입니다.

예제

카페 메뉴의 값을 견줍니다. +·- 같은 계산은 비교보다 먼저 합니다. 그래서 4번 줄은 latte - coffee가 500이 된 뒤 500 == 500을 견주어 True입니다.

coffee = 4000
latte = 4500
print(coffee < latte)
print(latte - coffee == 500)
print(coffee != 4000)
실행 결과
True
True
False

글자를 견줄 때는 빈칸도 글자입니다. 입력이나 파일에서 온 글자는 strip()으로 양 끝의 빈칸을 떼고 견줍니다.

item = '커피 '
print(item == '커피')
print(item.strip() == '커피')
실행 결과
False
True

자주 틀리는 곳

틀린 생각: == 연산자도 =처럼 이름을 값에 붙인다.

=와 == 기호는 모양이 비슷해서 하는 일도 비슷해 보입니다. 그러나 == 연산자는 같은지 묻기만 해서, price는 그대로 4000에 붙어 있습니다.

price = 4000
price == 4500
print(price)
실행 결과
4000

맞는 규칙: == 연산자는 두 값이 같은지 물어 True·False를 만들 뿐, 이름을 붙이지 않습니다. 이름을 값에 붙이는 것은 = 같은 대입입니다(규칙 2).

틀린 생각: 따옴표 안의 수도 수로 견준다.

따옴표 안에 숫자만 있으면 수처럼 보입니다. 그러나 파이썬에게 따옴표 안은 글자라서, 글자의 규칙으로 견줍니다.

print('10' < '9')
print('20' == 20)
print(int('20') == 20)
실행 결과
True
False
True

1번 줄은 첫 글자 '1'과 '9'를 견주어 True입니다. 2번 줄은 글자 '20'과 수 20이라 False이고, 3번 줄은 int('20')이 만든 수 20과 20을 견주어 True입니다.

맞는 규칙: 따옴표 안은 글자라서 첫 글자부터 견주고, 글자와 수는 같을 수 없습니다. 수로 견주려면 int()로 수를 만든 뒤 견줍니다.

틀린 생각: 소문자로 쓴 true도 True와 같은 값이다.

영어 글에서는 true를 소문자로 쓰므로 코드에도 그렇게 쓰게 됩니다. 그러나 파이썬에서 소문자 true는 값이 아니라 만든 적 없는 이름으로 읽힙니다.

ok = true
실행 결과
Traceback (most recent call last):  File "main.py", line 1, in <module>    ok = true         ^^^^NameError: name 'true' is not defined. Did you mean: 'True'?

맨 아래 줄은 'true라는 이름이 없다'는 오류이고, 힌트(Did you mean)가 맞는 값 True를 짚어 줍니다.

맞는 규칙: 파이썬은 대문자와 소문자를 다른 글자로 읽고, true를 True로 짐작해 주지 않습니다. 참·거짓 값은 첫 글자가 대문자인 True·False로 씁니다(규칙 6).

확인 문제

1. 예제의 latte를 4000으로 바꿨습니다. 무엇이 찍히는지 줄마다 그대로 쓰세요.

coffee = 4000
latte = 4000
print(coffee < latte)
print(latte - coffee == 500)
print(coffee != 4000)
힌트

이름 자리에 값을 넣고, 계산을 먼저 한 뒤 견줍니다.

정답
실행 결과
False
False
False

4000 < 4000은 두 값이 같아 작지 않으므로 False입니다. 0 == 500도, 4000 != 4000도 False입니다.

흔한 오답은 첫 줄의 True입니다. < 연산자가 '작거나 같은가'를 묻는다고 본 것입니다. 같을 때도 True가 되게 하려면 <= 연산자를 씁니다.

2. 실행하면 True가 찍히도록 빈칸 셋에 차례로 =나 == 기호를 쓰세요.

price ___ 4500
same ___ price ___ 4500
print(same)
힌트

값에 이름을 붙이는 자리인지, 같은지 묻는 자리인지 가립니다.

정답

차례로 =·=·== 기호입니다.

price = 4500
same = price == 4500
print(same)
실행 결과
True

1번 줄은 price를 4500에 붙입니다. 2번 줄은 오른쪽 price == 4500이 먼저 True로 접히고, 그 값에 same이 붙습니다.

흔한 오답은 1번 줄에 == 기호를 쓰는 것입니다. == 연산자도 =처럼 이름을 값에 붙인다고 본 것입니다(== 연산자도 이름을 붙인다는 생각). 그러면 1번 줄이 아직 아무 값에도 붙지 않은 이름 price를 읽으려다 NameError로 멈춥니다.

3. 성적 기록에서 두 점수를 견줍니다. 무엇이 찍히는지 줄마다 쓰세요.

best = '100'
mine = '95'
print(best > mine)
print(int(best) > int(mine))
힌트

1·2번 줄의 값에 따옴표가 있는지 보고, 3·4번 줄이 각각 무엇과 무엇을 견주는지 보세요.

정답
실행 결과
False
True

3번 줄은 글자끼리의 비교라 첫 글자 '1'과 '9'를 견줍니다. '1'이 앞이라 '100'이 더 작고, 결과는 False입니다. 4번 줄은 수로 바꾼 100과 95를 견주어 True입니다.

흔한 오답은 3번 줄의 True입니다. 따옴표 안의 수도 수로 견준다고 본 것입니다(문자열과 수를 가리지 않는 생각).

아래 코드의 2번 줄 다음에 age = 25를 넣으면 찍히는 두 줄을 봅니다.

처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

파이썬 목차로