포도가게의 개발일지
파이썬 (11) 본문
반응형
파이썬 제어 흐름
- Iter는 프로그래밍에서 데이터 구조를 순차적으로 접근할 수 있게 하는 객체로, 반복 가능한 객체(iterable)에서 요소를 차례로 가져올 수 있는 객체를 의미.
- yield from은 서브 제너레이터나 반복 가능한 객체에서 값을 직접 전달받아 호출한 제너레이터로 다시 값을 전달하는 역할을 함.
- Iterable: 반복 가능한 객체.
- Iterator: 반복자를 통해 요소를 차례로 접근.
- Generator: 제너레이터는 이터레이터를 생성하며, yield를 사용하여 값을 순차적으로 생성.
- iter() 함수를 사용해 반복 가능한 객체를 이터레이터로 변환.
- next()로 다음 요소를 가져옴.
단어의 시퀀스
- 파이썬이 객체 x를 반복해야할때 언제나 iter()를 자동으로 호출한다.
- iter()는 iter구현을 확인후 호출하여 iterator를 가져온다.
- 없다면, getitem이 구현되어있으면 파이썬은 index 0 부터 순서대로 가져오는 iterator를 생성한다.
- 여기서 실패하면 obeject is not iterable error가 발생한다.
센티넬
- 센티넬(sentinel)은 "감시자"나 "종료 신호" 역할을 하는 특별한 값이에요. 반복(iteration)에서 "여기서 멈춰!"라는 플레이스홀더로 사용되죠. 보통 None, 특정 문자열, 숫자 등 고유한 값을 지정해서, 반복이 언제 끝날지 알리는 데 쓰입니다.
반복형 자체를 반복자로 만들면 안되는 이유
- GOF에 따르면 다중 순회를 지원하려면 동일한 반복형 인스턴스로부터 여러 개의 독립적인 반복자를 생성할수있어야한다.
- 각 반복자는 각각 고유한 내부상태를 유지해야한다.
Iterator를 따로 구현하고싶지않을때는 Generator, 작동방식
- 본체 안에 yield 키워드가 있는 함수는 모두 제너레이터다. 제너레이터 함수는 호촐되면 제너레이터 객체를 반환한다. 제너레이터 함수는 제너레이터 팩토리이다.
- 제너레이터 반환 객체는 iterator protocol을 따르며 next()가 호출할때마다 실행되고 suspend됩니다.
- 왜 제너레이터가 더 나을까?: 클래스 방식의 interator 구현은 boilerplate 코드 많음 (인덱스 관리 등). 제너레이터는 yield로 간단히 구현 가능.
코루틴과 제너레이터
- 코루틴은 사실 제너레이터 함수로 본체 안에 yield 키워드를 가진다.
- 제너레이터는 반복하기 위한 데이터를 생성한다
- 코루틴은 데이터의 소비자다
- send() 를 통해 제너레이터 내부 yield에 값을 전달한다. close(), throw()로 종료시킬수있다.
yield from
- 서브 제너레이터로 하위에 다른 제너레이터에게 yield를 위임함. 중첩된 코루틴 연결에 유용
Comments