파이썬 코드를 보다면 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
'파이썬 > 자주하는 질문' 카테고리의 다른 글
파이썬(Python) *args **kwargs 는 무엇일까? (0) | 2020.09.12 |
---|---|
파이썬(Python) 외부 프로그램 실행하기 (0) | 2020.09.11 |
파이썬(Python) if __name__ == '__main__': 은 무엇일까? (0) | 2020.09.11 |
파이썬(Python) 문자열을 in-place로 수정하는 방법 (0) | 2020.09.10 |
파이썬(Python) 2진수 10진수로 변환하기 (2) | 2020.09.10 |
댓글