[Python for me] 이터레이터와 제네레이터

아름다운 이터레이터

제너레이터는 단순화된 이터레이터다

제너레이터 내포식

>>> listcomp = ['Hello' for i in range(3)]
['Hello', 'Hello', 'Hello']

>>> genexpr = ('Hello' for i in range(3))
<generator object <genexpr> at 0x1036c3200>

문제

  1. __iter____next__ 메서드가 어떻게 작동하여 파이썬 객체를 반복하게 하는지 설명하여라.

  2. 파이썬에서 for-in 반복문이 동작하는 원리에 대해서 설명하여라.

  3. 퍼사드 패턴에 대해서, __iter__, __next__ 호출을 iter()와 enxt() 호출로 대체 한 것과 관련하여 설명하여라.

  4. 이터레이터가 반복되는 항목이 고갈되어 반복이 끝났다는 사실을 어떻게 알릴 수 있을까?

  5. 이터레이터에서 사용 가능한 모든 값을 전부 소모했음을 알리기위해 OOO 예외를 발생시킨다

  6. 아래 코드를 보고 코드에 대해서 설명해보시오.

    repeater = BoundedRepeater("Hello", 3)
    iterator = iter(repeater)
       
    while True:
      try:
        item = next(iterator)
      except StopIteration:
        break
       print(item)
    
  7. 파이썬 2와 파이썬3의 이터레이터 구현 시 차이점은 무엇인가?

  8. 이터레이터가 파이썬 에서 매우 유용한 이유는?

    • 보기 좋은 for-in 반복문을 작성할 수 있고 코드를 파이썬 답고 효율적으로 만들 수 있게 해준다.
  9. 이터레이터를 쉽게 작성할 수있는 간편 문법은?

    1. 제너레이터와 yield
  10. 제너레이터의 동작 방식은?

    • 단지 제너레이터 객체를 만들고 반환한다.
    • 제너레이터 객체에서 next()가 호출될 때만 실행된다.
    • return이 호출될 때
      • 함수의 호출자에게 제어권을 영구적으로 넘긴다.
      • 함수의 로컬 상태를 삭제한다.
    • yield일 때,
      • 함수의 호출자에게 제어권을 다시 전달하지만 ‘일시적으로만’ 한다.
      • 함수를 일시 중단하고 로컬 상태를 유지한다.
  11. 아래의 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
    
  12. 위의 답을 while이 아닌 for를 통해 구현해 보아라.

  13. 제어 흐름이 yield문 이외의 방법으로 제너레이터 함수를 떠나면 제너레이터는 StopIteration 예외를 발생시키기 시작한다.

  14. 제너레이터 표현식을 적고 설명하여라.

    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
    
  15. 제너레이터 함추가 메모리 효율적인 이유에 대해서 설명하시오

  16. 복잡한 이터레이터의 경우 제너레이터 함수 또는 클래스 기반 이터레이터를 작성하는 것이 좋은 이유는 무엇인가?

  17. 제너레이터 표현식을 사용할 때 유일한 단점에 대해서 서술 하시오.

  18. 제너레이터 체인에 대해서 설명하시오.

출처