언어/Python

generator, yield

JM Lee 2023. 12. 4. 14:06
728x90

generator란 이터레이터를 생성해주는 함수이다. 메모리를 효율적으로 사용하면서 반복을 수행하도록 돕는 객체다.

이터레이터는 클래스에 __iter__, __next__ 또는 __getitem__ 메서드를 구현해야 한다.

하지만 제너레이터 함수 내부에는 이 메서드들이 내장되어 있기 때문에 이터레이터보다 훨씬 간단하게 작성할 수 있다.

 

아래 사이트에서 그림을 가져왔는데, 간단히 이해하기 위해서 이 그림을 읽어보았고 간단하게 구현도 해보았다.

https://dojang.io/mod/page/view.php?id=2412

def generator():
	yield 0
	yield 'Alphabet'
	yield False
gen = generator()
print(next(gen)) # 0
print(next(gen)) # 'Alphabet'
print(next(gen)) # False
def simple_generator(n):
    for i in range(n):
        yield i

# generator 함수 호출
my_generator = simple_generator(5)

# 값을 하나씩 가져오기
print(next(my_generator))  # 출력: 0
print(next(my_generator))  # 출력: 1
print(next(my_generator))  # 출력: 2
print(next(my_generator))  # 출력: 3
print(next(my_generator))  # 출력: 4

'''
모든 값을 생성하면 StopIteration 예외가 발생
따라서 보통은 for 루프를 사용하여 모든 값을 순회합니다.
'''
for value in simple_generator(3):
    print(value)
# 출력:
# 0
# 1
# 2

 


 

코드에서도 yield를 계속 작성했는데, 그렇다면 yield는 무엇일까?

yield 키워드는 해당 키워드를 실행하고 함수를 호출한 쪽으로 다시 프로그램의 제어를 넘겨준다.

설명이 잘 이해가 안 된다면 그냥 위에 쓴 코드 보고 그렇구나 하는 것이 더 편할 수 있다.

 

본래 파이썬의 일반적인 출력방식은 Return을 사용한 방식이 일반적이다.

그러므로 Return과의 차이는 어떤 점인지를 이해하면 좋다.

 

Return : Return 함수가 실행되면 반복문 등의 함수 동작이 멈춰지게 된다.

yield : 함수는 일시정지하지만 절대 완전히 끝나는 것이 아니다. 그리고 그 시점에서 어떤 값을 내놓았는지, 변수 등을 모두 기억한다.

 

즉, yield를 호출하면 원하는 값을 리턴하며, 실행 흐름을 일시 정지하여 함수를 재활용할 수 있는 상태로 만든다.

 

 

yield의 작동 방식은 아래 그림과 같다.

https://dojang.io/mod/page/view.php?id=2412

 


 

generator는 일반적으로 많이 쓰는 것은 아니다.

하지만 결국 선배들의 말씀을 빌려보면, 대용량 데이터를 처리할 때, 극한의 효율이 필요할 때에는 generator가 좋은 방법이 될 것이라고 한다.

잘 모르겠어도 일단은 공부하는 것이 결국 중요하다.


Reference

https://dojang.io/mod/page/view.php?id=2412

 

파이썬 코딩 도장: 40.1 제너레이터와 yield 알아보기

Unit 40. 제너레이터 사용하기 제너레이터는 이터레이터를 생성해주는 함수입니다. 이터레이터는 클래스에 __iter__, __next__ 또는 __getitem__ 메서드를 구현해야 하지만 제너레이터는 함수 안에서 yield

dojang.io

https://j-sik.tistory.com/126

 

[Python] 빠르게 배우는 파이썬 - yield 란?

본 포스팅은 코딩을 처음 배우시는 입문자 분들께는 적절하지 않은 포스팅일 수 있습니다. 개발에 필요한 최소한의 내용만 정리해서 포스팅합니다. Summary 📜 Generator와 yield에 대한 이해 yield를

j-sik.tistory.com

https://yeomko.tistory.com/11

 

갈아먹는 파이썬 [1] generator와 yield

들어가며 파이썬을 주로 사용하시는 분들이라면 한번쯤 generator에 대해서 들어보셨을 겁니다. 하지만 딱이 몰라도 코딩하는데 큰 지장이 없어서 그냥 지나치신 분들이 많으실 것으로 생각합니

blog.firstpenguine.school