Victoree's Blog

[5] 제어흐름 - 반복형, 반복자, 제너레이터 본문

Python/Fluent Python

[5] 제어흐름 - 반복형, 반복자, 제너레이터

victoree 2023. 6. 22. 18:21
728x90

사실 이 책을 읽기 시작할 때, 제어 흐름 챕터에 관심있는 부분들이 제일 많아서 기대하고 있었다. 모호했던 내 머리속에 있는 개념들을 잘 정리할 수 있는 기회가 될 것 같아서! 이 챕터부터 몇 가지의 주제들로 파이썬의 비동기 프로그래밍 관련한 내용이 다뤄지지 않을 까 싶다.

5.1 반복형과 반복자

파이썬 2.2에서 yield 가 추가되면서, 이 키워드는 제너레이터를 생성할 수 있게 해주었다. 모든 제너레이터는 반복자다. 파이썬의 collections들은 모두 반복형이며, 다음과 같은 과정으로 iter() 함수가 동작한다.

  1. 객체가 __iter__() 메소드를 구현하였는지 확인하고, 이 메서드를 호출해서 반복자를 가져온다.
  2. __iter__() 메소드가 구현되어있지 않지만, __getitem__()이 구현되어 있다면, 파이썬은 인덱스 0부터 시작해서 항목을 순서대로 가져오는 반복자를 수행한다.
  3. 이과정이 모두 실패하면 'TypeError: C object is not iterable' 이라는 메시지와 함께 에러가 실행된다.

위 동작이 구현되어있는 (iter 또는 getitem) 객체들은 모두 반복형이다. __next__()에 다음 항목을 반환하고, __iter__() 메소드를 지원하면, 우리는 그것을 반복자라고 부른다. 모든 반복자는 iter이 구현되어있기 때문에 반복형이지만, 모든 반복형은 반복자가 아니다. 

다음 항목을 반환하거나, 다음 항목이 없을 때 StopIteration 예외를 발생시키는, 인수를 받지 않는 __next__ 메소드를 구현하는 객체

우리는 위 정의를 반복자라고 부른다. 

5.2 제너레이터

제너레이터는 iterator를 생성해주는 함수로, 함수안에 yield 키워드를 사용한다. 이터레이터는 클래스에 __iter____next__ 또는 __getitem__ 메서드를 구현해야 하지만, 제너레이터는 함수 안에서 yield라는 키워드만 사용하면 된다.

yield from 이란 키워드는 파이썬 3.3 버전부터 지원한 키워드인데, 외부 제너레이터의 호출자와 내부 제너레이터를 연결하는 통로를 만든다. 제너레이터를 코루틴으로 사용해서 호출자 코드에 값을 생성해줄 뿐만 아니라 호출자 코드에서 가져온 값을 소비하는 경우에 통로로 사용되기도 한다. 이런 방식으로 제너레이터를 사용하면, 제너레이터가 코루틴이 되며 우리는 코루틴 내부에 제너레이터의 데이터를 수신 및 송신을 할 수 있다. 

728x90
Comments