iterator 를 생성해 주는 function 이다. itertor 는 next() 메소드르 이용해 데이터에 순차적으로 접근이 가능한 object이다. generator는 일반함수와 비슷해 보이지만, 가장 큰 차이점은 yield !!
실제 값을 출력하기전에는 함수를 실행하지 않다가 수행하는 순간 출력되는 함수
- 메모리를 효율적으로 사용 할 수 있다.
- 계산 결과 값이 필요할 때까지 계산을 늦추는 효과 >> lazy evalution
yield
generator가 일반 함수와 구분되는 가장 핵심적인 부분이다.
일반적인 함수는 사용이 종료되면 결과값을 호출부로 반환 후 함수 자체를 종료시킨 후 메모리 상에서 클리어 된다. 하지만 yield 를 만난 경우, 해당 함수는 그 상태로 정지 되며, 반환 값을 next() 를 호출한 쪽으로 전달하게 된다. 이후 해당 함수는 일반적인 경우 처럼 종료되는 것이 아니라 그 상태를 유지하게 된다.
즉, 함수에서 사용된 local 변수나 instruction pointer 등과 같은 함수 내부에서 사용된 데이터들이 메모리에 그래도 유지되는 것이다.
def yield_test(n):
i = 0
while i < n:
yield i
# return 값과 비슷하게 동작하게 된다,
# 하지만 return 값과 다른것중하나는 return 하는 순간 함수는 종료되지만
# yield 는 데이터가 여기서 머물게 된다 i가 5이상이 될때까지
i += 1
for x in yield_test(5):
print(x)
- 메모리를 효율적으로 사용 할 수 있다.
- 계산 결과 값이 필요할 때까지 계산을 늦추는 효과
import time
L = [1,2,3]
def print_iter(iter):
for element in iter:
print(element)
def lazy_return(num):
print("sleep 1s")
time.sleep(1)
return num
print("comprehension_list=")
comprehension_list = [lazy_return(i) for i in L]
print_iter(comprehension_list)
# comprehension_list=
# sleep 1s
# sleep 1s
# sleep 1s
# 1
# 2
# 3
print("generator_exp=")
generator_exp = (lazy_return(i) for i in L)
print_iter(generator_exp)
# generator_exp=
# sleep 1s
# 1
# sleep 1s
# 2
# sleep 1s
# 3
generator_exp
- for문이 실행 되면서,
generator_exp = (1,2,3)
- generator 함수는 일반함수와 동일한 절차로 실행된다.
- lazy_return() 함수의
return num=1
인 채로print_iter()
함수로 넘어간다.- iter => element = 1 이 출력됩니다. (이후 반복)
comprehension_list
- for문이 실행 되면서, `comprehension_list = [1,2,3]
- 일반 함수와 동일한 절차로 실행된다.
lazy_return()
함수 파라미터의[lazy_return(i) for i in L]
가 모두 실행된 후
sleep 1s sleep 1s sleep 1s
출력한다.print_iter()
의 파라미터로num=3
들어가서1 2 3 출력