Python
[Python] 제너레이터(generator)
UnoCode
2020. 6. 27. 18:07
제너레이터 란?
- 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