Doby's Lab

Python의 Generator에 대하여 본문

Code about AI/Python

Python의 Generator에 대하여

도비(Doby) 2023. 1. 10. 22:27

https://draw-code-boy.tistory.com/511

 

Python의 Iterator에 대하여

파이썬의 Iterator라는 개념이 존재합니다. 이를 알기 위해서는 Iterable Object에 대해 먼저 알아야 합니다. Iterable Object 파이썬의 모든 것은 객체로 이루어져 있습니다. 때문에 Iterable Object라는 것은 '

draw-code-boy.tistory.com

본 포스팅은 Iterator에 대한 포스팅과 이어집니다.


Generator

Generator란 Iterator를 생성하기 위한 함수입니다.

+ 통상적으로 Generator로부터 생성된 Iterator를 Generator Iterator라고 합니다.

 

기본적인 개념만 듣고는 조금 어렵게 다가올 수 있지만 Iterator를 생성하는 iter()를 생각했을 때는 보다 쉽게 다가옵니다.


명령어 yield

Generator를 만들기 위해서는 특별한 것 없이 보편적인 함수를 선언하듯이 선언하되 return이라는 명령어가 yield로 바뀌었을 뿐이라는 것을 알고 있으면 됩니다.

li = [1, 2, 3, 4]

def gene_li():
    for data in li:
        yield data
        
li_iter = gene_li()

print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))

작동 방식

  1. 함수와 달리 Generator Iterator 선언과 동시에 실행되지 않습니다.
  2. next()를 통해 실행이 되고, Generator는 yield가 있는 곳까지 실행됩니다.
  3. 그 후, Generator는 일시 중단되며 다시 next()로 실행했을 때, 중단되었던 곳에서 다시 시작합니다.

아래와 같은 코드를 실행했을 때를 예시로 작동 방식에 대해 알아봅시다.

li = [1, 2, 3, 4]

def gene_li():
    print('Generator Work')
    for data in li:
        yield data
        
        yield data * 2
        
        yield data * 4

li_iter = gene_li()

print('Declare Iterator')

while True:
    try:
        print(next(li_iter))
    except:
        break
# Output
Declare Iterator
Generator Work
1
2
4
2
4
8
3
6
12
4
8
16

Generator Iterator를 선언했을 때, 즉시 실행되지 않고, next()를 통해 실행되는 것이기 때문에

'Declare Generator'가 출력되고, 그다음 while을 통해 next()가 실행되어 'Generator Work'가 실행되는 것을 알 수 있습니다.

 

또한, next()가 실행된 후, yield가 실행되었던 부분에서 다시 시작된다고 했는데

첫 번째 yield 값이 1이고, 다음 yield 값이 data * 2 임을 확인하였을 때, 두 번째 yield 값이 2인 것을 보아 말했던 작동 방식대로 돌아가는 것을 확인할 수 있습니다.


이점

Iterator와 마찬가지로 메모리 효율의 관점에서 데이터를 바로 폐기한다는 것이 큰 이점입니다.

또한, Iterator와 달리 함수 내에서 다양한 로직을 구현하여 쓸 수 있다는 것에서 Iterator보다 나은 이점을 가지고 있습니다.


Reference

https://blog.naver.com/PostView.naver?blogId=youndok&logNo=222073937387&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView 

 

파이썬 generator 함수 - yield 명령어 및 next()

본 포스팅에서는 Python의 generator 함수와 yield 명령어에 대해 알아보겠습니다. generator(또는 genera...

blog.naver.com

 

728x90