Python 공식 문서
이건 JavaScript에서도 공통으로 겪었던 문제인데, 소수는 컴퓨터에서 이진수로 정확히 표현할 수 없는 수라서 근사값으로 저장된다. 그래서 0.1 + 0.2 == 0.3이 False 값이 나온다.
price = 0.1 + 0.2
print(price == 0.3) # False
실제로 0.1 + 0.2 를 출력해보면, 0.30000000000000004 이 출력된다.
print(0.1 + 0.2) # 0.30000000000000004
0.1과 0.2는 이진수로 정확히 표현되지 않아 근사값으로 저장되고, 그 근사값들을 더한 결과 역시 정확한 0.3이 아니라 0.3보다 약간 큰 수가 된다.
이 값이 다시 float로 반올림되면서 0.30000000000000004라는 결과가 출력된다.
이러한 float의 표현 오차를 피하기 위해 파이썬은 decimal.Decimal 클래스를 제공한다.
Decimal은 2진수가 아닌 10진수 기반 표현을 사용하여 소수를 정확하게 표현할 수 있다.
from decimal import Decimal
num1 = Decimal('0.1')
num2 = Decimal('0.2')
num3 = Decimal('0.3')
print(num1 + num2 == num3) # True
단, float의 표현 오차를 피하기 위해 Decimal 객체는 문자열을 사용하여 초기화해야 한다. float를 전달하면 이미 발생한 오차가 그대로 복사되기 때문이다.
iterator는 데이터의 흐름(stream)을 나타내는 객체다. 여기서 stream은 모든 데이터를 한 번에 들고 있는 구조가 아니라 필요할 때마다 다음 값을 하나씩 꺼내오는 흐름을 의미한다.
iterator는 __iter__()와 __next__() 메서드를 구현해야 한다.
iter(): iterable 객체로부터 iterator를 반환한다.next(): 다음 요소를 하나씩 꺼낸다. 더 이상 꺼낼 요소가 없을 경우 StopIteration 예외가 발생한다.Python의 for문은 iterator 프로토콜을 기반으로 구현되어 있다.
capitals = ["Amsterdam", "Brussels", "Canberra"]
for capital in capitals:
print(capital)
for문 내부적으로 다음과 같이 실행된다.
capitals = ["Amsterdam", "Brussels", "Canberra"]
it = iter(capitals)
while True:
try:
capital = next(it)
print(capital)
except StopIteration:
break
Generator는 yield 키워드를 사용하여 값을 하나씩 생성하며, 호출 시마다 다음 값을 반환하는 iterator를 만들어내는 함수다.
모든 값을 미리 생성하지 않고, 요청될 때마다 순차적으로 생성한다.
generator 생성법
yield 키워드 사용 (일반 함수는 return 키워드 사용)def read_log_lines(path):
with open(path, "r") as f:
for line in f:
yield line.strip()
generator 표현식: ( )을 사용한다.six_times_table = (6 * x for x in range(1, 11))
print(type(six_times_table)) # <class 'generator'>
print(six_times_table) # <generator object <genexpr> at 0x73daf0fbe190>
next()나 for문으로 순회할 때 값을 반환한다.while True:
try:
print(next(six_times_table))
except StopIteration:
break
for val in six_times_table:
print(val)
An object capable of returning its members one at a time.
iter(obj)을 호출할 수 있다. (iterator를 반환한다.)next(obj) 호출은 불가능하다.iterable 객체 : list, tuple, str, set, dict, rangeIt returns the data one element at a time.
iter(obj)을 호출할 수 있다. (자기 자신을 반환한다.)next(obj)을 호출할 수 있다.iterable과 iterator의 관계iterable → iter() → iterator → next()iterator는 iterable이다.스터디 때문에 늦게 집에 돌아와서 TIL 블로그 밀려서 정리하기 힘들다... 주말을 이용해 목요일 수업을 정리했다. 앞으로는 밀리지 말자!