본문 바로가기

Python

Python: Generator # 제너레이터 # yield

728x90
반응형

Generator

  - 이터레이터를 생성해주는 함수

  - yield의 개수만큼 이터레이터에서 값을 꺼낼 수 있다.

 

* generator를 통해 생성된 이터레이터는 하나씩 값을 꺼낼 수 있다. (yield 개수 만큼)

  -> 부분적으로 여러번 yield를 통해 값을 바깥으로 전달 가능하기 때문에 특정 결과를 순차적으로 얻을 때, 통으로 결과를 기다릴 필요 없이 부분적으로 확인 가능 (예시 코드는 아래)

* 모든 값을 생성하는 것이 아니라 yield에 걸리는 값만 생성해서 메모리에 올리므로 메모리를 효율적으로 사용 가능

 (이터레이터는 값을 미리 만들지 않고 값이 필요한 시점에 값을 만드는 방식)

 

예시

- return을 사용하는 일반 함수 예시

import time


def return_number():
    num_list = []
    for i in range(5):
        time.sleep(1)
        num_list.append(i)
    return num_list


for i in return_number():
    print(i)

위 함수는 0~4까지 num_list에 1초마다 넣어진 후에 print가 되므로

5초가 다 지나서 0,1,2,3,4 가 한번에 프린트된다.

 

- yield (제너레이터)를 사용하는 예시

import time


def return_number():
    for i in range(5):
        time.sleep(1)
        yield i


for i in return_number():
    print(i)

위의 예시는 1초 후에 0, 또 1초 후에 1 을 프린트한다.

결과적으로 0~4를 1초마다 하나씩 프린트한다.

 

물론 위와 같은 함수는 아래처럼 return을 통해서도 구현 가능하긴 하다

import time


def return_num2():
    for i in range(5):
        time.sleep(1)
        print(i)


return_num2()

 

위와 같은 예시보다 제너레이터는 중간 중간 다른 함수가 실행될 수 있다는 것에 그 강점이 있다고 본다.

import time


def yield_count():
    count = 0
    while True:
        yield count
        count += 1


g = yield_count()
print(next(g))
print("다른 작업 1")
print(next(g))
print("다른 작업 2")
print(next(g))

# 0
# 다른 작업 1
# 1
# 다른 작업 2
# 2

 

728x90
반응형