숫자는 두 종류, 참/거짓은 한 종류
일상적으로 쓸 숫자 타입은 int와 float이에요. 참/거짓을 위한 bool이 여기에 더해집니다. 보통의 파이썬 프로그램이 필요로 하는 산술과 논리는 이 정도면 대부분 해결돼요.
파이썬은 불리언을 정수의 하위 타입으로 취급하기도 해요 — True는 실제로 1이고 False는 실제로 0입니다. 이 성질을 이용한 유용한 트릭이 뒤에 몇 개 나와요.
정수 산술
파이썬의 정수는 오버플로우가 없어요. 중요해 보이지 않다가도, 처음으로 팩토리얼 함수를 만들어 보면 깨닫게 돼요 — 대부분의 다른 언어라면 여기서 조용히 음수로 굴러떨어져 있었을 거라는 걸요.
둘 다 얼마나 크든 정확한 답을 내놓습니다. 한계는 메모리뿐이에요.
산술 연산자는 예상 가능한 것들에 몇 개가 더 얹혀 있어요:
이 목록에서 꼭 기억해 둘 세 가지:
/는 Python 3에서 항상 float을 반환합니다. 양쪽이 둘 다 정수여도 그래요.10 / 2는5가 아니라5.0입니다. 정수가 필요하면//를 쓰세요.//는 음의 무한대 쪽으로 내림합니다. 그래서-7 // 2는-3이 아니라-4예요. 특이하지만 일관성은 있어요.%는 나머지를 돌려줘요. "이 수가 짝수인가?"(n % 2 == 0)나 고정된 범위로 값을 감싸 돌릴 때 유용합니다.
float의 유명한 함정
float은 태생적으로 완벽하지 않아요. 이진수로 저장되는데, 이진수는 대부분의 소수를 정확히 표현하지 못하거든요. 교과서 예제:
첫 줄은 0.30000000000000004를 출력해요. 두 번째 줄은 False를 출력하고요. IEEE 754 표준을 따르는 모든 언어 — 파이썬, JavaScript, Java, C — 가 똑같이 동작합니다. 파이썬 버그가 아니에요.
실전에서 이게 의미하는 바는 두 가지예요:
- float을
==로 비교하지 마세요. "충분히 가까움"이 필요하다면math.isclose(a, b)를 쓰거나abs(a - b) < some_tolerance같은 식으로 비교하세요. - 돈은
decimal.Decimal로 다루세요. 표준 라이브러리decimal모듈은 정확한 십진수 연산을 제공합니다 —0.1 + 0.2같은 놀라움이 없어요. float보다 느려서 기본값은 아니지만, 통화 계산에는 맞는 선택입니다.
숫자 타입 간 변환
파이썬은 정수를 문자열로, 문자열을 숫자로 알아서 바꿔주지 않아요. 명시적으로 요청해야 합니다:
유효하지 않은 변환은 ValueError를 발생시킵니다:
>>> int("hello")
ValueError: invalid literal for int() with base 10: 'hello'
에러 메시지가 단도직입적이라 대응하기 쉬워요. 입력을 정리하든, 예외를 잡든 선택하세요.
불리언, 조금 더 깊이
True와 False가 두 개의 불리언 값이에요 — 쓴 그대로, 첫 글자가 대문자. 대부분의 비교 연산은 이 둘 중 하나를 내놓습니다:
불리언 연산자는 기호가 아니라 영어 단어로 쓰는 and, or, not입니다:
알아두면 좋은 미묘한 점: and와 or가 꼭 True나 False를 돌려주는 건 아니에요 — 식의 결과를 결정한 값을 돌려줍니다. 0 or "fallback"은 "fallback"을, 5 and 10은 10을 돌려줘요. 덕분에 name = user_input or "anonymous" 같은 짧은 기본값 패턴을 쓸 수 있고, 불리언 검사 결과 타입이 예상과 다르게 나올 때 이해하는 데도 도움이 됩니다.
Truthy와 Falsy
파이썬은 if나 while 같은 불리언 문맥에서 많은 값을 "참스러움" 또는 "거짓스러움"으로 다뤄요. falsy 값은 다음과 같아요:
False0,0.0None- 비어 있는 컨테이너:
"",[],{},set(),()
이 외의 모든 값은 truthy예요. 덕분에 조건문을 더 자연스럽게 쓸 수 있습니다:
if name:을 "name에 뭐라도 들어있다면"으로 읽으세요. if name != "":보다 훨씬 깔끔합니다. 다만 숫자를 다룰 때는 주의하세요 — if count:는 0을 "건너뛰기"로 취급합니다. 대부분 그게 원하시는 바이지만 항상 그런 건 아니에요. 0이 정당한 값이라면 대신 if count is not None:을 쓰세요.
불리언 산술
불리언은 정수이기도 하기 때문에, 그냥 산술 연산을 할 수 있어요:
이 트릭은 충분히 자주 쓰이니까 기억 속에 챙겨두세요. 리스트에서 어떤 테스트를 통과한 항목이 몇 개인지 세고 싶다면, 불리언을 내놓는 제너레이터를 sum에 넘기세요:
실용적인 정리
- 정수는 오버플로우가 없어요. 마음껏 쓰세요.
/는 float을 돌려줍니다. 정수 나눗셈이 필요하면//를 쓰세요.- float은
==로 비교하지 말고 허용 오차를 두거나 돈은Decimal로 다루세요. - truthiness가 조건문을 더 읽기 좋게 만들어줘요 —
0과 빈 문자열이 falsy라는 것만 잊지 마세요.
다음은 input과 print예요 — 조용히 끝나는 스크립트를 사용자와 대화하는 프로그램으로 바꿔주는 두 도구입니다.
자주 묻는 질문
파이썬에서 int와 float의 차이는 뭔가요?
int는 소수점이 없는 정수고, float은 소수점이 있는 숫자예요. 파이썬 정수는 크기에 제한이 없어요 — 오버플로우가 없습니다. float은 표준 IEEE 754 규칙을 따르기 때문에 소수 연산에서 아주 작은 정밀도 손실이 생길 수 있어요.
파이썬에서 0.1 + 0.2가 왜 0.3이 안 되죠?
이진 부동소수점은 대부분의 소수를 정확하게 표현할 수 없기 때문이에요. 0.1 + 0.2는 0.30000000000000004가 됩니다. 파이썬 버그가 아니에요 — IEEE 754 float을 쓰는 모든 언어가 똑같이 동작해요. 정확한 소수 계산이 필요하면 decimal 모듈을 쓰세요.
파이썬에서 truthy와 falsy 값이 뭔가요?
파이썬은 불리언 문맥에서 많은 값을 참 또는 거짓으로 취급해요. 글자 그대로 True나 False가 아니어도 말이죠. 0, 빈 문자열, 빈 리스트, 빈 딕셔너리, None은 falsy고, 대부분의 나머지 값은 truthy입니다. if my_list:는 "리스트에 뭐라도 들어있다면" 정도로 읽으면 돼요.