[Python for me] 이터레이터와 제네레이터
아름다운 이터레이터
__iter__
및__next__
던더 베서드를 지원하는 객체는 for-in 반복문에서 자동으로 작동한다.- 클래스 기반 이터레이터는 파이썬에서 반복 가능한 객체를 만드는 방법 중 하나일 뿐
제너레이터는 단순화된 이터레이터다
제너레이터 내포식
>>> listcomp = ['Hello' for i in range(3)]
['Hello', 'Hello', 'Hello']
>>> genexpr = ('Hello' for i in range(3))
<generator object <genexpr> at 0x1036c3200>
- 위와 같이 제너레이터 표현식은 리스트 객체를 생성하지 않는다
- 대신 클래스 기반 이터레이터 또는 제너레이터 함수처럼 필요할 때 값을 생성한다.
문제
-
__iter__
와__next__
메서드가 어떻게 작동하여 파이썬 객체를 반복하게 하는지 설명하여라. -
파이썬에서
for-in
반복문이 동작하는 원리에 대해서 설명하여라. -
퍼사드 패턴에 대해서,
__iter__
,__next__
호출을 iter()와 enxt() 호출로 대체 한 것과 관련하여 설명하여라. -
이터레이터가 반복되는 항목이 고갈되어 반복이 끝났다는 사실을 어떻게 알릴 수 있을까?
-
이터레이터에서 사용 가능한 모든 값을 전부 소모했음을 알리기위해 OOO 예외를 발생시킨다
-
아래 코드를 보고 코드에 대해서 설명해보시오.
repeater = BoundedRepeater("Hello", 3) iterator = iter(repeater) while True: try: item = next(iterator) except StopIteration: break print(item)
-
파이썬 2와 파이썬3의 이터레이터 구현 시 차이점은 무엇인가?
-
이터레이터가 파이썬 에서 매우 유용한 이유는?
- 보기 좋은 for-in 반복문을 작성할 수 있고 코드를 파이썬 답고 효율적으로 만들 수 있게 해준다.
-
이터레이터를 쉽게 작성할 수있는 간편 문법은?
- 제너레이터와 yield
-
제너레이터의 동작 방식은?
- 단지 제너레이터 객체를 만들고 반환한다.
- 제너레이터 객체에서 next()가 호출될 때만 실행된다.
- return이 호출될 때
- 함수의 호출자에게 제어권을 영구적으로 넘긴다.
- 함수의 로컬 상태를 삭제한다.
- yield일 때,
- 함수의 호출자에게 제어권을 다시 전달하지만 ‘일시적으로만’ 한다.
- 함수를 일시 중단하고 로컬 상태를 유지한다.
-
아래의 Iterator class를 제너레이터 함수로 변환해 보아라.
class BoundedRepeater: def __init__(self, value, max_repeats): self.value = value self.max_reapeats = max_repeats self.count = 0 def __iter__(self): return self def __next__(self): if self.count >= self.max_repeats: raise StopIteration self.count += 1 return self.value
답:
def bounded_repeater(value, max_repeats): count = 0 while True: if count >= max_repeats: return count ++ 1 yield value
-
위의 답을 while이 아닌 for를 통해 구현해 보아라.
-
제어 흐름이 yield문 이외의 방법으로 제너레이터 함수를 떠나면 제너레이터는 StopIteration 예외를 발생시키기 시작한다.
-
제너레이터 표현식을 적고 설명하여라.
genexpr = (expression for item in collection) def generator(): for item in collection: yield expression
genexpr = (expression for item in collection if condition) def generator(): for item in collection: if condition: yield expression
-
제너레이터 함추가 메모리 효율적인 이유에 대해서 설명하시오
-
복잡한 이터레이터의 경우 제너레이터 함수 또는 클래스 기반 이터레이터를 작성하는 것이 좋은 이유는 무엇인가?
-
제너레이터 표현식을 사용할 때 유일한 단점에 대해서 서술 하시오.
-
제너레이터 체인에 대해서 설명하시오.
출처
- Python tricks the book