비교 연산자(comparison operator)는 두 값을 견주어 True(참)나 False(거짓) 값 하나를 만듭니다. 나이가 20 이상인지, 고른 메뉴가 커피인지처럼 '그런가?'를 묻는 일은 모두 비교로 시작합니다.
지금까지 만든 프로그램은 위에서 아래로 모든 줄을 실행했습니다. 다음 레슨의 if는 조건에 따라 실행할 줄을 고르는데, 그 조건이 비교가 만든 True·False입니다. 비교식도 대입문의 오른쪽처럼 그 줄이 실행될 때 한 번 계산되어 값 하나로 접힙니다.
이 단원(조건)을 이미 안다면 단원 연습 문제부터 풀고 틀린 레슨만 보세요.
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 = 7 | x를 7에 붙인다 | 이름 x가 7을 가리킨다 |
x == 7 | x가 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
True1번 줄은 첫 글자 '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
False4000 < 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)True1번 줄은 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
True3번 줄은 글자끼리의 비교라 첫 글자 '1'과 '9'를 견줍니다. '1'이 앞이라 '100'이 더 작고, 결과는 False입니다. 4번 줄은 수로 바꾼 100과 95를 견주어 True입니다.
흔한 오답은 3번 줄의 True입니다. 따옴표 안의 수도 수로 견준다고 본 것입니다(문자열과 수를 가리지 않는 생각).
아래 코드의 2번 줄 다음에 age = 25를 넣으면 찍히는 두 줄을 봅니다.
처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.