[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
'''

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다