본문 바로가기
C.W.K.
Stream
Lesson 05 of 07 · published

숫자와 참·거짓, 그리고 값이 없다는 뜻

~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

정수는 크기 제한을 거의 의식하지 않아도 돼

Python의 int는 메모리가 허락하는 범위에서 커져. 2진수·8진수·16진수 표기와 자릿수 구분용 밑줄도 지원해. 나눗셈 /은 실수를, 몫 연산 //은 바닥 나눗셈 결과를 준다는 차이도 기억해.

실수는 십진수를 정확히 저장하지 못할 수 있어

float는 IEEE 754 이진 부동소수점이야. 그래서 0.1 + 0.2가 정확히 0.3이 아니라 0.30000000000000004가 될 수 있어. 근삿값 비교에는 math.isclose를 쓰고, 통화처럼 십진 정확성이 계약이라면 문자열에서 만든 Decimal을 써.

bool과 None

boolTrueFalse를 나타내며 정수 계층과도 연결돼 있어. None은 0이나 빈 문자열이 아니라 “값이 없음”을 뜻하는 하나뿐인 객체야. 조건식에서는 0, 빈 문자열, 빈 컨테이너, None이 거짓으로 평가되고 나머지 대부분은 참으로 평가돼.

변환은 실패할 수 있어

int, float, str, bool로 값을 바꿀 수 있지만, 의미가 맞지 않으면 예외가 나. 특히 bool('False')가 참인 이유는 글자의 뜻이 아니라 “비어 있지 않은 문자열”이기 때문이야.

원칙: 숫자 타입은 계산 영역의 계약으로 골라. 빠른 근삿값이면 float, 정확한 십진값이면 Decimal이야.

Code

큰 정수와 여러 진법 표기·python
>>> 2 ** 100                        # 100자리 정수, 오버플로 없음
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가 정확한 0.3이 아닌 이유·python
>>> 0.1 + 0.2
0.30000000000000004                  # 정확한 0.3이 아님

>>> 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·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')
조건식에서 값이 참과 거짓이 되는 규칙·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.3math.isclose(0.1 + 0.2, 0.3)을 차례로 확인해. 이어서 Decimal('0.1') + Decimal('0.2')를 계산해 차이를 봐. 마지막으로 이 수업에 나온 거짓값들을 리스트에 넣고 각각 bool() 결과를 확인한 뒤, 빈 컨테이너가 왜 거짓으로 쓰이는지 설명해봐.

Progress

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

댓글 0

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

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