Generator(제너레이터)는 Iterator를 반환하는 함수이며, yield
키워드를 사용하여 생성할 수 있습니다. 함수 내에서 yield
를 사용하면 함수는 제너레이터를 반환합니다. 제너레이터는 모든 결과값을 메모리에 저장하지 않기 때문에 좋은 성능을 낼 수 있습니다.
def generator(): # 제너레이터 생성
yield 1
yield 2
yield 3
g = generator()
print(g) # <generator object generator at 0x110bcbca8>
Generator의 함수 목록을 확인해보면, Iterator에서 볼 수 있는 __iter__
와 __next__
함수가 포함되어 있는 것을 확인할 수 있습니다. __next__
함수가 포함되어 있기 때문에 next()
함수를 사용하여 제너레이터의 각 요소에 접근할 수 있습니다.
print(g) # ['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close',
'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']
print(next(g)) # 1
print(next(g)) # 2
print(next(g)) # 3
for
반복문을 활용하여 Generator의 요소에 접근할 수 있습니다.
for i in generator():
print(i)
# 1
# 2
# 3
Iterator와는 달리, Generator에 더 이상 출력할 요소가 없으면 StopIteration
에러가 자동적으로 발생합니다.
print(next(g)) # 1
print(next(g)) # 2
print(next(g)) # 3
print(next(g)) # StopIteration:
References
- https://dojang.io/mod/page/view.php?id=2412