[Python] Iterable, Iterator, Generator
목차
· Iterable
· Iterator
· Generator
Iterable
· 한 번에 하나씩 멤버를 반환할 수 있는 객체
ex) list, dict, set, str, byte, tuple, range
Iterator
· Iterable 객체를 순회하는 객체
· 데이터 스트림을 나타내는 객체로 iterator의 __next__() 메서드에 대한 반복 호출은 스트림에서 연속적인 아이템을 반환한다.
· Iterator 객체는 항상 Iterable 객체이지만, Iterable 객체는 Iterator 객체 될 수도 아닐 수도 있다.
· 파이썬 내장함수 iter()을 사용해 iterator 객체를 생성할 수 있다.
list = [1, 2, 3]
list_iter = iter(list)
· iterable 객체는 매직메서드 __iter__ 메서드를 가지고 있어 해당 메서드로 iterator를 만들 수 있다.
set = {4, 5, 6}
set_iter = set.__iter__()
· 파이썬 내장함수 next() 함수는 iterator 객체의 __next__() 메서드를 호출하여 iterator 객체의 다음 값을 반환한다.
- 해당 메서드는 반복의 마지막에 StopIteration Exception을 raise 한다.
list = [1, 2, 3]
list_iter = iter(list)
set = {4, 5, 6}
set_iter = set.__iter__()
while True:
try:
item = next(list_iter)
print("list_iter_item: ", item)
item = next(set_iter)
print("set_iter_item: ", item)
except StopIteration:
print('종료!!')
break
Generator
· lazy iterator를 반환하는 함수
- lazy는 계산의 결과 값이 필요할 때까지 계산을 늦춘다는 의미다. 이러한 방법을 Lazy Evaluation이라한다. 이를 필요 없는 계산을 하지않아 실행을 더 빠르게 할 수 있다.
· Generator 함수 안에 yield를 사용하여 데이터를 하나씩 리턴하는 방식으로 iterator를 구현할 수 있다.
· Generator 함수는 진입점이 여러 개로 원하는 시점에 원하는 데이터를 받을 수 있다.
def number_generator():
yield 0 # 0을 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보
yield 1 # 1을 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보
yield 2 # 2을 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보
generator_obj = number_generator()
number = next(generator_obj)
print(number)
number = next(generator_obj)
print(number)
number = next(generator_obj)
print(number)
number = next(generator_obj) # StopIteration Exception 발생
출처
https://docs.python.org/3/glossary.html#term-iterable
https://realpython.com/introduction-to-python-generators/
https://dongsik93.github.io/til/2019/09/18/til-python-generator/