비교연산
1. 비교연산자
비교 연산자는 두 값을 비교하여 그 결과가 참(True)인지 거짓(False)인지를 판단하는 연산자입니다. 이 연산자들은 주로 조건문이나 반복문에서 조건을 검사할 때 사용됩니다.
| 연산자 | 의미 | 예시 |
|---|---|---|
== | 같음 | 5 == 5 → True |
!= | 같지 않음 | 5 != 3 → True |
< | 작음 | 3 < 5 → True |
<= | 작거나 같음 | 5 <= 5 → True |
> | 큼 | 6 > 5 → True |
>= | 크거나 같음 | 5 >= 5 → True |
1.1 == (같음)
두 값이 같으면 True를 반환합니다.
print(5 == 5) # 결과: True
# print(5 = 5) # 잘못된 예시
1.2 != (같지 않음)
- 두 값이 다르면 True를 반환합니다.
print(5 != 3) # 결과: True
1.3 < (작음)
- 왼쪽 값이 오른쪽 값보다 작으면 True를 반환합니다.
print(3 < 5) # 결과: True
1.4 <= (작거나 같음)
- 왼쪽 값이 오른쪽 값보다 작거나 같으면 True를 반환합니다.
print(5 <= 5) # 결과: True
1.5 > (큼)
- 왼쪽 값이 오른쪽 값보다 크면 True를 반환합니다.
print(6 > 5) # 결과: True
1.6 >= (크거나 같음)
- 왼쪽 값이 오른쪽 값보다 크거나 같으면 True를 반환합니다.
print(5 >= 5) # 결과: True
2. 다양한 활용
숫자뿐만 아니라 문자열, 리스트, 튜플 등도 비교할 수 있습니다. 문자열과 시퀀스 자료형은 앞에서부터 한 칸씩 짝을 지어 비교하다가, 처음으로 달라지는 자리에서 승부가 갈립니다. 이를 사전식 비교라고 합니다.
문자를 비교할 때는 유니코드 번호를 기준으로 삼습니다.
print('apple' < 'banana') # 결과: True
위처럼 알파벳은 구분하기가 쉽지만 한글은 쉽지 않습니다. 유니코드표에서 하는 D558번째에 있으며 후는 D6C4번째에 있습니다.
print('하하' > '후후') # 결과: False
아래처럼 연속적인 비교도 가능합니다.
x = 10
print(5 < x < 15) # 결과: True
복잡한 조건: 논리 연산자(and, or, not)와 함께 사용하여 복잡한 조건을 생성할 수 있습니다.
3. 나아가기
아래처럼 리스트의 비교는 맨 앞자리를 비교합니다.
[10, 20, 30] > [20, 30, 40] # False
아래처럼 같은 시퀀스형 자료형이라도 타입이 다르면 비교가 가능하지 않습니다.
[10, 20, 30] > (20, 30, 40) # error
맨 앞자리가 같으면 그 다음 자리로 넘어가며 비교를 해나갑니다.
'abcde' > 'abcda' # True
비교하던 문자가 한쪽에서 먼저 떨어지면, 길이가 더 긴 쪽이 큰 값으로 취급됩니다. 아래에서 'abcd'는 'abcda'와 네 번째 자리까지 같지만 거기서 끝나므로 더 작은 값입니다.
'abcd' > 'abcda' # 결과: False
이러한 비교연산, 산술연산은 모두 class에서 구현이 되어 있습니다.
class int(int):
def __eq__(self, other):
return True
# 10 < 11
int('10') == int('11')
class int(int):
def __add__(self, other):
return self * other
# 10 + 11
int(10) + int(11)
4. 부동소수점의 비교
이 부동소수점 수를 직접 비교하려고 하면 문제가 생길 수 있습니다. 그래서 파이썬에서는 math.isclose()라는 특별한 함수를 제공하여 이런 문제를 해결할 수 있게 도와줍니다. 이 함수는 두 수가 충분히 가까운지를 확인해줍니다.
import math
result = 0.1 + 0.2
print(result == 0.3) # False
print(math.isclose(result, 0.3)) # True
print(math.isclose(result, 0.29)) # False
print(math.isclose(result, 0.31)) # False
print(math.isclose(result, 0.30000001)) # False