C.W.K.
Stream
Lesson 05 of 07 · published

기본 4 타입 — int, float, bool, 그리고 만나게 될 None

~22 min · int, float, bool, none, 타입, decimal, ieee754, truthiness

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

int — 임의 정밀도, 오버플로 없음

Python 의 int 는 최대값이 없어. 다른 언어들은 32비트나 64비트 정수 주고 그 이상 가면 오버플로. Python 은 필요한 만큼 정수 표현을 확장해 — 10자리 두 개 곱하면 20자리 답, 별 문법 X, 라이브러리 X. CPython 이 뒤에서 처리, 호출자는 그냥 *정확성* 을 받아.

이게 들리는 것보다 유용해. 암호학, 조합론, 대규모 카운팅 — C/Java 에서 오버플로와 싸우는 도메인이 Python 에선 그냥 동작. 비용은 연산 당 작은 오버헤드, 평범한 숫자엔 보이지 않아.

정수 리터럴이 여러 진법 지원 — 0x 16진, 0o 8진, 0b 2진. 리터럴 안에 underscore 허용 (가독성용) — 1_000_0001000000 보다 읽기 쉬워. 비트 연산자 (& | ^ ~ << >>) 가 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.3False. 실제 합은 0.30000000000000004. Python 버그 X — 부동소수점 수학이 *어디서나* 이렇게 동작. 모든 언어가 같은 방식으로 틀려.

경고: float 비교 *절대* == 안 함. math.isclose(a, b) 써, tolerance 안에서 비교. 기본 tolerance 가 대부분 경우 합리적, 필요하면 좁힘.

Decimal — float 로 안 될 때

*정확한 십진 표현* 이 중요한 도메인 — 돈, 과학적 측정, 규제 영역 — float 대신 decimal.Decimal 써. Decimal 은 자릿수를 *정확히* 저장하고 반올림 동작도 정밀하게 제어할 수 있어.

성능은 float 보다 느려 (대략 100배), hot loop 에선 손 안 대. 근데 송장 합계, 세금 계산, 재무 보고 — 거기선 Decimal 이 옳은 타입.

bool — True, False, 그 외

Python 의 bool 은 두 값 — TrueFalse. 대문자 시작; 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 평가 가능. 룰:

  • FalsyFalse, None, 0, 0.0, "" (빈 문자열), [] (빈 list), {} (빈 dict), () (빈 tuple), set() (빈 set)
  • Truthy — 그 외 전부, 빈 거 아닌 문자열, 0 아닌 숫자, 빈 거 아닌 컬렉션 포함

이게 Pythonic idiom if items: 를 가능하게 해 (if len(items) > 0: 대신). 둘 다 동작, 첫 게 idiom. Pythonic 트랙에서 trade-off 깊이 파.

자기참조: cwkPippa 의 백엔드는 truthiness 어디서나 써 — 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% 커버.

Pythonic Way: 컬렉션 비어있나 체크는 truthiness (if items:, if len(items) == 0: 아님). None 체크는 is None (== None 아님). float 비교는 math.isclose (== 아님). 돈은 Decimal. 각 한 줄짜리 변경, 미래에 *반드시* 고마워할 결정이야.

Code

int — 오버플로 X, 여러 진법, 가독성용 underscore·python
>>> 2 ** 100                        # 100자리 정수, 오버플로 X
1267650600228229401496703205376

>>> 0xff, 0o77, 0b1010              # 16/8/2 진 리터럴
(255, 63, 10)

>>> 1_000_000                        # underscore 가독성용 — 1000000 과 같음
1000000

>>> 0b1100 & 0b1010                  # int 에 직접 비트 AND
8                                    # = 0b1000
0.1 + 0.2 함정 — float 와 IEEE 754·python
>>> 0.1 + 0.2
0.30000000000000004                  # 0.3 정확 X

>>> 0.1 + 0.2 == 0.3
False                                # 정상 동작

>>> import math
>>> math.isclose(0.1 + 0.2, 0.3)
True                                 # float 비교의 옳은 방법

>>> # 왜 이런가 — 0.1 이 이진법에서 순환 분수.
>>> # IEEE 754 배정밀도가 53비트, 나머지가 잘려나감.
Decimal — float 로 안 될 때·python
>>> from decimal import Decimal

>>> Decimal("0.1") + Decimal("0.2")
Decimal('0.3')                       # 정확!

>>> # Decimal 에 *항상 문자열* 통과, float 말고:
>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> # 왜냐면 float 0.1 이 이미 부정확 — Decimal 이 그 부정확성 보존.

>>> # 사용 사례 — 돈:
>>> price = Decimal("19.99")
>>> tax_rate = Decimal("0.0825")
>>> total = price * (1 + tax_rate)
>>> total.quantize(Decimal("0.01"))   # 센트 단위 반올림
Decimal('21.64')
Truthiness — Pythonic 체크·python
>>> # 모든 falsy 값:
>>> for x in [False, None, 0, 0.0, "", [], {}, (), set()]:
...     print(bool(x))
False  False  False  False  False  False  False  False  False

>>> # Idiom — 컬렉션 비어있나:
>>> items = []
>>> if not items:
...     print("비어있음")
비어있음

>>> # Idiom — `or` 로 첫 non-falsy:
>>> name = user_input or "default"     # user_input 이 빈 문자열이면 "default" 씀

>>> # 노트 — bool 이 int 의 서브클래스. 깜짝이지만 사실:
>>> True == 1
True
>>> sum([True, True, False, True])     # truthy 값 카운트
3
타입 변환 함정·python
>>> int("42")
42
>>> int("3.14")
Traceback (most recent call last):
...
ValueError: invalid literal for int() with base 10: '3.14'
>>> int(float("3.14"))               # float 거치면 — 동작
3

>>> bool("False")                     # 깜짝 — 빈 거 아닌 문자열은 truthy
True
>>> # config 문자열 있으면 명시 체크:
>>> value = "False"
>>> bool_value = value.lower() in ("true", "1", "yes", "on")

External links

Exercise

REPL 에서 — 0.1 + 0.2 != 0.3 확인, 그 다음 math.isclose(0.1 + 0.2, 0.3) 확인. 그 다음 Decimal('0.1') + Decimal('0.2') 만들고 차이 확인. 마지막 — 이 lesson 의 모든 falsy 값 list 만들고, 각각 bool() 통과시켜서 다 False 반환 확인, 그리고 *왜 빈 컬렉션이 falsy 인지* 소리 내서 자기한테 설명. 3 분 REPL 이 이 lesson 두 번 읽기보다 나아.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.