728x90
SMALL
- 오늘은 앞 시간에 파이썬 이론 중 다루지 못했던 Iterator, Generator 관련 내용을 간단히 배우고, 이후부터는 쭉 하나의 데이터를 통해 분석하고 시각화하는 과정을 진행해보았습니다.
- 이 날 진행되었던 데이터 분석 프로젝트는 다음 글에 상세히 작성되어 있습니다!
[데이터 분석] 한국복지패널 데이터
부트캠프 기간 중 진행되었던 데이터 분석 프로젝트들은 따로 분리해서 관리하고자 합니다!우선 전에 진행했던 프로젝트들을 정리한 후, 추후 진행될 프로젝트들도 정기적으로 올려보도록 하
injoycode.tistory.com
♾️ Iterator
✨ Iterator가 뭐시냐면...
- 데이터를 순차적으로 접근할 수 있는 객체입니다.
- 일반적으로 for 문과 함께 사용되며, 한 번에 하나의 요소를 반환하면서 다음 요소로 이동하는 방식으로 작동합니다.
- Iterator는 다음 두 가지 조건을 만족하는 객체인데,
- __iter__() 메서드를 포함 → 해당 객체가 Iterator임을 나타내고,
- __next__() 메서드를 포함 → 한 번 호출될 때마다 다음 값을 반환, 더 이상 반환할 값이 없으면 StopIteration 예외를 발생
- 위 두 가지 조건이 만족되어야 진정한 Iterator가 될 수 있습니다!
✨ Iterable과 Iterator의 차이
- Iterable (반복 가능한 객체)
- __iter__() 메서드를 구현한 객체를 Iterable 이라고 부릅니다.
- list, tuple, set, dict, str 와 같은 자료 구조가 여기에 속하고,
- iter() 함수를 사용하면 Iterator 객체로 변환도 가능합니다.
- Iterator
- __iter__()와 __next__() 메서드를 구현한 객체로,
- 상태를 유지하며, next()를 호출할 때마다 다음 값을 반환해줍니다.
- 다음 값이 없으면, StopIteration 예외를 발생시키며 종료하는 객체입니다.
✨ list는 Iterator ❌ Iterable ⭕
numbers = [1, 2, 3, 4]
print(dir(numbers))
# 출력값
# __iter__()는 있지만 __next__()는 없었습니다.
✨ 직접 Iterator 구현하기
- 수업 시간에 간단하게 나만의 Iterator도 구현해 보았습니다.
- Iterator는 __iter__()와 __next__()를 구현하여 직접 만들 수가 있었습니다.
class MyIterator:
def __init__(self, data):
self.data = data
self.position = 0
# 해당 클래스로 생성한 객체를 iterator 객체로 변환
def __iter__(self):
return self
# next() / for in 문으로 데이터 추출 시 자동 호출
def __next__(self):
if self.position >= len(self.data):
raise StopIteration
result = self.data[self.position]
self.position += 1
return result
if __name__ == '__main__':
my_iter = MyIterator('153')
for item in my_iter:
print(item)
# 출력값
# 1
# 5
# 3
✨ Generator와의 차이
- 후에 나오는 Generator는 Iterator처럼 return을 쓰는 것이 아니라 yield 키워드를 사용하여 Iterator를 간편하게 생성해주는 함수입니다.
def mygen():
yield 'a'
yield 'b'
yield 'c'
gen = mygen()
print(next(gen)) # a
print(next(gen)) # b
print(next(gen)) # c
print(next(gen)) # StopIteration
- Generator는 yield를 만나면 현재 상태를 저장하고, 자체적으로 함수를 일시 정지시킵니다.
- 이후 next() 함수가 호출되면 이전 상태를 유지한 채 실행을 다시 시작해줍니다.
🏎️ 리스트 컴프리헨션 vs Generator
import time
def longtime_job():
print('job start')
time.sleep(1)
return 'done'
list_job = (longtime_job() for i in range(5))
print(next(list_job))
- 위 코드에서 list_job을 생성하는 두 가지 방법이 있는데, 하나는 리스트 컴프리헨션, 하나는 Generator를 사용하는 방식입니다.
✨ 1. 리스트 컴프리헨션의 동작 방식
# 파이썬은 함수 자체를 저장할 수 있음
list_job = [longtime_job() for i in range(5)]
print(next(list_job))
- longtime_job() 함수가 즉시 실행됩니다. (여기서는 총 5번 실행)
- list_job에는 longtime_job()의 실행 결과인 'done'이 저장됩니다.
- next(list_job) 실행하게 되면 TypeError가 발생!
⚠️ 갑자기 TypeError는 왜?
- 리스트 컴프리헨션인 [longtime_job() for i in range(5)]은 Iterator가 아니라 리스트를 생성하게 됩니다.
- 리스트는 __next__() 메서드가 없으므로 next(list_job)을 호출하면 당연히 에러가 발생할 수 밖에 없습니다.
- 리스트의 경우에는 next() 함수 대신 iter()로 먼저 리스트를 Iterator 변환 후 사용해야 합니다.
- 그래서 아래와 같이 코드를 수정해서 진행해보면 에러가 출력되지 않고 처리됩니다!
# 모든 job이 즉시 실행
list_job = [longtime_job() for i in range(5)]
# 리스트를 Iterator로 변환
list_iter = iter(list_job)
# 'done' 출력
print(next(list_iter))
✨ 2. Generator 표현식의 동작 방식
list_job = (longtime_job() for i in range(5))
print(next(list_job))
- 리스트 컴프리헨션과 달리 longtime_job() 함수가 지연 처리됩니다.
- list_job은 Generator 객체가 되고,
- next(list_job)을 호출하게 되면, 그제서야 longtime_job()이 실행됩니다.
✨ Generator의 장점
- 메모리 절약: 리스트 컴프리헨션은 한 번에 모든 요소를 메모리에 저장하지만, Generator는 필요할 때마다 생성해주는 특징 때문에 메모리를 아낄 수가 있습니다.
- 실행 속도 최적화: 모든 요소를 즉시 계산하지 않고, next()가 호출될 때마다 값을 반환하는 구조입니다.
- 무한 반복 가능: 리스트는 고정된 크기를 가지지만, Generator는 무한 루프가 가능합니다.
✨ Generator의 특징
- 기존 데이터를 기반으로 분석 모델을 생성한 후, 새로운 데이터가 들어올 때마다 즉시 처리하여 결과를 반환할 때 유용하게 사용됩니다.
- 대량의 데이터를 처리하거나 실시간 데이터 스트리밍, 머신러닝 모델의 배치 처리 등에 자주 활용된다고 합니다.
🤔 12일차 회고
- 오늘은 데이터를 쭉 분석해보기에 앞서 Iterator와 Generator를 배우고, 그 뒤 프로젝트 형식으로 데이터 분석 하나를 진행했습니다.
- 파이썬의 자료 구조들이 대부분 Iterable하다는 것까지는 알고 있었는데, 제가 Iterator를 커스텀하고 next() 함수로 이 객체들에 대해 접근하는 방법은 모르고 있었어서 오늘도 지식이 한 층 쌓여가는 느낌 !
- 그리고 후반부에 분석을 진행했던 데이터는 워낙 컬럼이 많고 커서 이 데이터의 다른 컬럼들을 가지고 추가적인 분석을 진행해도 좋겠다 싶었습니다.
- 전에 개인적으로 한국인들의 행복 지수 데이터를 가져와 어떤 원인으로 한국인들이 행복해지는지에 대해 분석해본 적이 있었는데, 이 데이터를 추가 결합해 분석을 진행해봐도 좋을 듯 합니다.
- 내일은 또다른 데이터로 분석을 이어나갈 것 같습니다. 놓고만 있었던 데이터 분석가의 길이 조금씩 열려가는 기분입니닷!! 🛣️
728x90
LIST
'부트캠프 > LG U+' 카테고리의 다른 글
🤔 심부전 데이터와 BeautifulSoup (6) | 2025.02.17 |
---|---|
🤔 가설 검정과 plotly 그리고 '워라벨' (0) | 2025.02.14 |
🤔 Python 이론 살짝 업글해보기 (4) | 2025.02.11 |
🤔 Numpy와 Seaborn 그리고 또다시...각화 (0) | 2025.02.07 |
🤔 Matplotlib을 활용한 본격적인 시각화 (2) | 2025.02.06 |