본문 바로가기
파이썬/자주하는 질문

파이썬(Python) yield 키워드 이해하기

by J-Build 2020. 9. 11.

파이썬 코드를 보다면 yield라는 녀석이 종종 보이긴 하는데 그 의미가 직관적으로 와닿지는 않습니다. 이 포스팅에서 조금 쉽게 yield를 이해 해보는 시간을 갖도롤 하겠습니다.

 

yield를 이해하기 위해서는 Iterable과 Generator를 이해하고 있어야 합니다. 

Iterable을 알아보기 위해 리스트는 순회하면서 리스트 아이템들을 출력하는 코드를 작성했습니다. 

my_list = [1, 2, 3]
for i in my_list:
    print(i)
# 1
# 2
# 3

 

위의 코드에서 my_list는 Iterable입니다. 즉, for ~ in ~ 구문에 넣어서 그 아이템들을 순회(Iteration) 할 수 있는 것들은 모두 Iteration이라고 볼 수 있습니다. 그래서 Iteration 가능한 딕셔너리(dict)나 셋(set) 등 역시 모두 Iterable이죠. 

 

이번엔 Generator를 알아볼께요. 먼저 generator를 하나 만들께요. 

my_generator = (x*2 for x in range(3))
print(my_generator)
# <generator object <genexpr> at 0x7fc05d027eb8>

 

list comprehension과 비슷하게 생겼습니다. 사실 (..) 을 [..] 으로 아래처럼 바꿔주면 리스트가 되겠죠. 

my_list = [x*2 for x in range(3)]
print(my_list)
# [0, 2, 4]

 

차이점은 아이템을 필요할때마다 만들어서 주느냐(generation), 미리 메모리에 모든 아이템을 로드해놓느냐 입니다. 즉, generator는 아직 아이템들을 만들어 놓지는 않았지만 요청을 하면 그때 그때 만들어서 전달 해주겠다는 의미죠. 그리고 요청한 아이템들을 끝까지 다 반환하고 나면 더 이상 그 generator는 사용할 수 없게 됩니다. 아래 코드에서 확인해 볼께요. 

for i in my_generator:
    print(i)
# 0
# 2
# 4

# 이미 아이템 생성을 끝까지 다 했기 때문에, 한번 더 요청을 해보면, 
for i in my_generator:
    print(i)

# 아무런 아이템도 주지 않게 됩니다. 

 

이제 드디어 yield를 이해 할 차례입니다. 

yield 키워드는 return 키워드와 비슷하게 함수에서 무언가를 반환할때 쓰입니다. 차이점은 yield는 함수를 generator로 만들어서 요청이 있을때마다 그 함수에서 값을 만들어 반환 한다는 것 입니다. 코드로 확인을 해볼께요. 

def create_generator():
    for i in range(3):
        yield i*2

my_generator = create_generator()	# 함수를 호출하면 generator가 생성이 됩니다. 
print(my_generator)
# <generator object create_generator at 0x7fc05c6ed5c8>

 

그럼, 생성된 generator를 사용해 볼께요. 

for i in my_generator:
    print(i)
# 0
# 2
# 4

 

 

댓글