오늘도 개발

Iterator, Generator, Coroutine 본문

웹 프로그래밍/Python3

Iterator, Generator, Coroutine

Sueeeeeee 2022. 8. 17. 01:21

정리

- 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

 

 

참고

파이썬 코딩 도장 - 39.1 반복 가능한 객체 알아보기

Python 비동기 프로그래밍 제대로 이해하기(1/2) - Asyncio, Coroutine