[Python]이터레이터(Iterator), 제네레이터(Generator)
파이썬의 이터레이터, 제네레이터에 대해 알아보자.
# 병행성(Concurrency)
# 이터레이터(Iterator), 제네레이터(Generator)
t = 'ABCDEF'
# 반복가능한 이유 : iter(x)함수가 내부적으로 호출됨
for c in t:
pass
# print(c)
w = iter(t)
while True:
try:
print(next(w))
except StopIteration:
break
# 반복형 확인
from collections import abc
print(hasattr(t, '__iter__'))
print(isinstance(t, abc.Iterable))
print()
'''
A
B
C
D
E
F
True
True
'''
# next 직접 구현
class WordSplitter:
def __init__(self, text):
self._idx = 0
self._text = text.split(' ')
def __next__(self):
try:
word = self._text[self._idx]
except IndexError:
raise StopIteration('raise StopIteration')
self._idx += 1
return word
def __repr__(self):
return f'WordSplit{self._text}'
my_word = WordSplitter('My name is Jigi')
print(my_word)
print(next(my_word))
print(next(my_word))
print(next(my_word))
print(next(my_word))
print()
'''
WordSplit['My', 'name', 'is', 'Jigi']
My
name
is
Jigi
'''
# generator 패턴
# 1. 지능형 리스트, 딕셔너리, 집합 -> 데이터 양이 폭발적으로 증가하면 메모리사용도 같이 증가 -> 이 경우 제네레이터를 사용해 메모리 사용량을 줄일 수 있음
# 2. 단위 실행 가능한 코루틴(Coroutine) 구현과 연동됨
# 3. 작은 메모리 조각을 사용함
class WordSplitGenerator:
def __init__(self, text):
self._text = text.split(' ')
def __iter__(self):
for word in self._text:
yield word # 제네레이터
return
def __repr__(self):
return f'WordSplitGenerator{self._text}'
my_word2 = WordSplitGenerator('My name is Jigi')
iter_word = iter(my_word2)
print(my_word2, iter_word)
print(next(iter_word))
print(next(iter_word))
print(next(iter_word))
print(next(iter_word))
'''
WordSplitGenerator['My', 'name', 'is', 'Jigi'] <generator object WordSplitGenerator.__iter__ at 0x102fbce40>
My
name
is
Jigi
'''
최신 댓글