int — 임의 정밀도, 오버플로 없음
Python 의 int 는 최대값이 없어. 다른 언어들은 32비트나 64비트 정수 주고 그 이상 가면 오버플로. Python 은 필요한 만큼 정수 표현을 확장해 — 10자리 두 개 곱하면 20자리 답, 별 문법 X, 라이브러리 X. CPython 이 뒤에서 처리, 호출자는 그냥 *정확성* 을 받아.
이게 들리는 것보다 유용해. 암호학, 조합론, 대규모 카운팅 — C/Java 에서 오버플로와 싸우는 도메인이 Python 에선 그냥 동작. 비용은 연산 당 작은 오버헤드, 평범한 숫자엔 보이지 않아.
정수 리터럴이 여러 진법 지원 — 0x 16진, 0o 8진, 0b 2진. 리터럴 안에 underscore 허용 (가독성용) — 1_000_000 이 1000000 보다 읽기 쉬워. 비트 연산자 (& | ^ ~ << >>) 가 int 에 직접 동작.
float — IEEE 754, 그리고 0.1 + 0.2 함정
Python 의 float 는 64비트 IEEE 754 배정밀도 — 모든 현대 언어가 쓰는 같은 표현. 그 표현이 *대부분의 십진 분수* 를 정확히 표현할 수 없어. 0.1 은 이진법에서 *순환 분수* (10진법의 1/3 처럼). 저장된 값은 *대략* 0.1, *정확히* 가 아님.
그래서 0.1 + 0.2 == 0.3 가 False. 실제 합은 0.30000000000000004. Python 버그 X — 부동소수점 수학이 *어디서나* 이렇게 동작. 모든 언어가 같은 방식으로 틀려.
== 안 함. math.isclose(a, b) 써, tolerance 안에서 비교. 기본 tolerance 가 대부분 경우 합리적, 필요하면 좁힘.
Decimal — float 로 안 될 때
*정확한 십진 표현* 이 중요한 도메인 — 돈, 과학적 측정, 규제 영역 — float 대신 decimal.Decimal 써. Decimal 은 자릿수를 *정확히* 저장하고 반올림 동작도 정밀하게 제어할 수 있어.
성능은 float 보다 느려 (대략 100배), hot loop 에선 손 안 대. 근데 송장 합계, 세금 계산, 재무 보고 — 거기선 Decimal 이 옳은 타입.
bool — True, False, 그 외
Python 의 bool 은 두 값 — True 와 False. 대문자 시작; true 는 NameError. Bool 은 사실 *int 의 서브클래스* — True == 1, False == 0, 그리고 산술 가능 (sum([True, True, False]) 가 2 반환). 가끔 유용, 가끔 깜짝.
None — 부재의 객체
None 이 Python 의 null. *Singleton* — None 객체는 *정확히 하나*, None 의 모든 참조가 *같은 그것* 을 가리켜. 그래서 if x is None 이 동작 — singleton 에 대한 정체성 비교.
명시적 return 안 하는 함수는 암묵적으로 None 반환. Default 인자가 자주 None. 데이터베이스 NULL 값이 None 으로 돌아와. 어디서나 봐 — *"여긴 값 없음"* 으로 다뤄.
Truthiness — Python 에서 *"true"* 로 치는 것
Python 의 if 는 boolean 만 받지 않아. *어떤 값이든* truthiness 평가 가능. 룰:
- Falsy —
False,None,0,0.0,""(빈 문자열),[](빈 list),{}(빈 dict),()(빈 tuple),set()(빈 set) - Truthy — 그 외 전부, 빈 거 아닌 문자열, 0 아닌 숫자, 빈 거 아닌 컬렉션 포함
이게 Pythonic idiom if items: 를 가능하게 해 (if len(items) > 0: 대신). 둘 다 동작, 첫 게 idiom. Pythonic 트랙에서 trade-off 깊이 파.
if response_text: 가 if response_text != "": 대신, if user.session: 가 if user.session is not None: 대신. 짧은 형태가 독자가 *질문* (*"객체 있나?"*) 에 집중하게 해, *메커니즘* (*"빈 거/null 비교"*) 말고.
타입 변환 — int(), float(), str(), bool()
각 built-in 타입이 *생성자* 로도 두 배 — 다른 값 변환. int("42") 가 문자열 파싱. float("3.14") 도. str(42) 가 반대 방향. bool(0) 이 False; bool([]) 이 False; bool("hello") 가 True.
기억할 함정 두 개 — int("3.14") 가 ValueError 던져, *"3.14" 가 정수가 아니라서*. 문자열에서 int 가려면 float 거쳐서 — int(float("3.14")) 가 3. 그리고 bool("False") 가 True, *문자열 "False" 가 비어있지 않아 (truthy) 라서*. boolean-ish 문자열 읽으면 명시적 비교 또는 JSON-aware 파서 써.
요약
int 는 최대값 없음. float 는 0.1 정확 표현 불가. Decimal 이 float 부족할 때. None 은 singleton. Truthiness 가 boolean 보다 넓어. 이 다섯 사실이 Python 의 타입 관련 깜짝의 95% 커버.
if items:, if len(items) == 0: 아님). None 체크는 is None (== None 아님). float 비교는 math.isclose (== 아님). 돈은 Decimal. 각 한 줄짜리 변경, 미래에 *반드시* 고마워할 결정이야.