오늘도 개발
Iterator, Generator, Coroutine 본문
정리
- iterable : __iter__메서드를 갖는 객체. iterable에 __iter__ 메서드를 사용하면 iterator를 반환한다.
- iterator : __next__ 메서드를 갖는 객체. iterator에 __next__ 메서드를 사용하면 iteration을 할 수 있다.
- generator : iterator를 생성하는 함수. 함수 안에 yield 키워드를 넣으면 자동으로 generator가 된다.
generator를 호출하면 __iter__, __next__ 메서드를 둘 다 갖는 generator 객체(=iterator)를 반환한다.
- coroutine : 함수 밖에서 값을 받아올 수 있는 generator. 함수 실행을 멈췄다가 재개할 수 있다.
Iterator
iterable이란?
반복 가능한 객체. (ex. list, dictionary, range)
for x in y 구문에서 y에 올 수 있는 모든 객체.
__iter__()메서드를 갖는 객체.
iterable에 __iter__() 메서드를 사용하면 iterator를 반환함.
iterator를 사용해서 iteration을 할 수 있는 객체.
iterator란?
iteration 상태를 기억하는 객체.
__next__() 메서드를 갖는 객체.
값을 차례대로 꺼낼 수 있다.
iteration을 실제로 실행하는 객체.
# 파이썬 코딩 도장 <39.2 이터레이터 만들기>에서 가져온 코드입니다.
# iterator 만들어보기
class Counter:
def __init__(self, stop):
self.current = 0
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.current < self.stop:
r = self.current
self.current += 1
return r
else:
raise StopIteration
for i in Counter(3):
print(i)
Generator
iterator를 생성해주는 함수.
함수 안에 yield 키워드만 사용하면 됨.
제너레이터를 호출하면 제너레이터 객체(=iterator)가 반환된다.
반환된 제너레이터 객체는 __iter__와 __next__ 메서드를 갖는다.
따라서 반환된 제너레이터 객체는 next를 사용하여 iteration할 수 있다.
# 파이썬 코딩도장 <40.1 제너레이터와 yield 알아보기>의 코드입니다.
def number_generator():
yield 0
yield 1
yield 2
for i in number_generator():
print(i)
# 0
# 1
# 2
g = number_generator()
g.__dir__()
# __iter__, __next__ 들어있음
Coroutine
함수 실행을 멈췄다가 재개할 수 있는 함수를 코루틴이라고 한다.
함수 밖에서 값을 받아올 수 있는 제너레이터라고 생각해도 된다.
yield를 사용하여 만든 코루틴을 제너레이터 코루틴이라고 한다.
# 파이썬 코딩도장 <41. 코루틴 사용하기>의 코드입니다.
def number_coroutine():
while True:
x = (yield)
print(x)
co = number_coroutine()
next(co)
co.send(1)
co.send(2)
co.send(3)
# 1
# 2
# 3
async, await를 사용하여 만든 제너레이터는 네이티브 코루틴이라고 한다.
async def co_example(x, y):
return x + y
참고
'웹 프로그래밍 > Python3' 카테고리의 다른 글
| Asyncio와 비동기 작업 2) Awaitables(Coroutine, Task, Future) (0) | 2022.08.24 |
|---|---|
| Asyncio와 비동기 작업 1) 개요 - 비동기적 처리란? 코루틴이란? (0) | 2022.08.23 |
| Python unittest 모듈로 Unit Test해보기 (0) | 2022.08.05 |
| Min, Max 함수 (0) | 2022.07.13 |
| 이메일과 비밀번호 예시로 보는 정규식(Regex) (0) | 2022.07.09 |