printf("ho_tari\n");

ep.17 Iterator, Generator 본문

두산 로보틱스 부트캠프 ROKEY/Python 교육

ep.17 Iterator, Generator

호타리 2024. 7. 30. 15:26

2024.7.30

오늘 오전 이론교육 시간에 배운 내용은 이터레이터(Iterator)이다.

이터레이터는 값을 차례대로 꺼낼 수 있는 객체이다.

파이썬에는 이터레이터만 생성하고 값이 필요한 시점이 되었을 때 값을 만드는 방식을 사용한다.

데이터 생성을 뒤로 미루는 것인데 이런 방식을 지연 평가(lazy evaluation)라고 한다.

이터레이터는 반복자라고 부르기도 한다.

반복 가능한 객체는 말 그대로 반복할 수 있는 객체인데 우리가 흔히 사용하는 문자열, 리스트, 딕셔너리, 세트가 반복 가능한 객체이다.

요소가 여러 개 들어있고 한 번에 하나씩 꺼낼 수 있는 객체이다.

객체가 반복 가능한 객체인지 알아보는 방법은 객체에 __iter__ 메서드가 들어있는지 확인해보면 된다.

리스트의 이터레이터를 변수에 저장한 뒤 __next__ 메서드를 호출해보면 요소를 차례대로 꺼낼 수 있다.

이터레이터는 __next__로 요소를 계속 꺼내다가 꺼낼 요소가 없으면 StopIteration 예외를 발생시켜서 반복을 끝낸다.

리스트뿐만 아니라 문자열, 딕셔너리, 세트도 __iter_를 호출하면 이터레이터가 나온다.

이터레이터에서 __next__를 호출하면 차례대로 값을 꺼낸다.

리스트, 문자열, 딕셔너리 세트는 요소가 눈에 보이는 반복 가능한 객체이다.

반복 가능한 객체는 요소를 한 번에 하나씩 가져올 수 있는 객체이고 이터레이터는 __next__ 메서드를 사용해서 파례대로 값을 꺼낼 수 있는 객체이다.

반복 가능한 객체(iterable)와 이터레이터(iterator)는 별 개의 객체이므로 둘은 구분해야 한다.

반복 가능한 객체에서 __iter__ 메서드로 이터레이터를 얻는다.

클래스로 이터레이터를 작성하려면 __init__ 메서드를 만든다.

이 객체는 리스트, 문자열, 딕셔너리, 세트, range처럼 __iter__를 호출할 반복 가능한 객체가 없으므로 현재 인스턴스를 반환하면 된다.

이 객체는 반복 가능한 객체이면서 이터레이터이다.

이터레이터를 만들 때는 __init__ 메서드에서 초깃값, __next__ 메서드에서 조건식과 현재값 부분을 주의해야 한다.

이 부분이 잘못되면 미묘한 버그가 생길 수 있다.

제너레이터는 이터레이터를 생성해주는 함수이다.

제너레이터는 함수 안에서 yield라는 키워드만 사용하면 끝이다.

제너레이터는 이터레이터보다 훨씬 간단하게 작성할 수 있다.

제너레이터는 발생자라고 부르기도 한다.

함수 안에서 yield를 사용하면 함수는 제너레이터가 되며 yield에는 값(변수)을 지정한다.

함수에 yield만 사용해서 간단하게 이터레이터를 구현할 수 있다.

이터레이터는 __next__ 메서드 안에서 직접 return으로 값을 반환했지만 제너레이터는 yield에 지정한 값이 __next__ 메서드(next 함수)의 반환값으로 나온다.

이터레이터는 raise로 StopIteration 예외를 직접 발생시켰지만 제너레이터는 함수의 끝까지 도달하면 StopIteration 예외가 자동으로 발생한다.

제너레이터는 제너레이터 객체에서 __next__ 메서드를 호출할 때마다 함수 안의 yield까지 코드를 실행하며 yield에서 값을 발생시킨다.( generate)

제너레이터 객체에서 __iter__ 를 호출하면 self를 반환하므로 같은 객체가 나온다. (제너레이터 함수 호출 -> 제너레이터 객체 -> __iter__ 는 self 반환 -> 제너레이터 객체)

yield를 사용하면 값을 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보한다.

yield는 현재 함수를 잠시 중단하고 함수 바깥의 코드가 실행되도록 만든다.

 

오후 실습 교육 시간에는 이론으로 배운 이터레이터와 제너레이터를 구현해보는 연습을 하였다.

파이썬을 배워오면서 이터레이터는 생소한 내용이었다. 코딩에 그닥 중요하게 작용하는 내용이 아니어서 그런지 이번 교육을 통해서 처음 배웠다. 처음 배워서 그런지 내용이 쉽지는 않았다. 복잡하지는 않지만 이해하기에 조금 낯선 내용이다. 반복 연습을 통해 점차 이해할 수 있을 것이라고 생각한다.

오늘 담당조교님께서 말씀해주신 내용은 다음과 같다.

이터레이터는 중요하지 않다
비동기식 프로그래밍 코루틴을 배우는 것이다

 

동기식 프로그램 vs 비동기식 프로그램
동기(sync)
코드가 동기적으로 동작한다 -> 코드가 반드시 작성된 순서 그대로 실행 된다
비동기(Async)
코드가 비동기적으로 동작한다 -> 코드가 반드시 작성된 숭서 그대로 실행되는 것이 아니다

사실 프레임워크가 어떻게 설계되었느냐의 문제

DR-01408_박성호_파이썬_연습문제_17차시.pdf
0.42MB

'두산 로보틱스 부트캠프 ROKEY > Python 교육' 카테고리의 다른 글

ep.18 Coroutine, 정규표현식  (0) 2024.07.31
ep.16 lambda  (0) 2024.07.29
ep.15 터틀 그래픽스 활용  (0) 2024.07.26
ep.14 자료구조3(시퀀스)  (0) 2024.07.25
ep.13 모듈  (0) 2024.07.24