본문 바로가기
Python

[Python] 제너레이터(generator)

by UnoCode 2020. 6. 27.

제너레이터 란?

 

  • generaotr 객체는 모든 값을 메모리에 올려두고 이용하는 것이 아니라 필요할 때마다 생성해서 반환하는 일을 한다.
  • 이 때문에 메모리를 효율적으로 사용할 수 있다는 장점이 있다. 

 

제너레이터를 이용한 for 문

my_generator = (x for x in range(1,4))
for n in my_generator:
	print(n)
 
print(type(my_generator))
    
 # 실 행 겨 과 
 
 1
 2
 3
 <class 'generator'>
 

반복자와 동일한 일을 하는 것처럼 보이지만 여기에서 생성된 1,2,3을 미리 메모리에 만들어 두는 것이 아니라

for 문에서 필요로 할 때마다 my_generator로 받아오며 메모리에서 보관하지 않는다 이를 lazy evaluation 이라 한다)

 

 

Yield

 

일반적인 함수의 return 문과 유사하다.

 

하지만 yield문은 제너레이터를 반환한다는 점에서 return 문과 차이가 있다.

 

def create gen():
	alist = range(1,4)
    for x in alist:
    yield x
    
my_generator = create_gen()
print(my_generator)

for n in my_generator:
	print(n)
    
    
# 결과 값
<generator object create_gen at 0x7f~~~~~>
1
2
3

return문 대신 yield문을 가지고 있는 제너레이터

 

 

Return : 함수가 끝나면 return이 호출되고 호출된 이후는 사라진다.

 

Yield : 함수가 끝나도 값을 해당함수의 결과 같을 가지고 있다.

 

제너레이터 사용시 주의사항

  • 제너레이터는 실행될 때 함수의 몸체를 실행하는 것이 아니라  제너레이터 함수가 가진 객체를 반환한다.
  • 이전의 코드를 실행한 후 추가한 코드를 실행하면 아무런 객체도 출력되지 않는다.
def create gen():
	alist = range(1,4)
    for x in alist:
    	yield x
    
my_generator = create_gen()
print(my_generator)

for n in my_generator:
	print(n)
    
#추가된 코드
for n in my_generator:
	print(n)
    
# 결과 값
<generator object create_gen at 0x7f~~~~~>
1
2
3

 

'Python' 카테고리의 다른 글

[Python] Generator Or Iterator 코드 분석 실습  (0) 2020.06.27
[Python] 이터레이터(Iterator)  (0) 2020.06.27
[Python] 패키지 생성 실습  (0) 2020.06.26
[Python] Sys modules  (0) 2020.06.25
[Python] funciton of arguments, parameter  (0) 2020.06.24

댓글