프로그래밍을 하다 보면 함수안에서 지역변수를 사용한것을 외부함수에서 쓰고 싶을때가 있는데 이럴때는 항상 문제가 있다.
지역변수란 함수가 종료되면 스택에서 사라져서 더이상 접근을 할 수 없게 되는데, 클로저는 이를 접근하여 사용할 수 있게 하는 그런 기술이다.
파이썬을 조금 해봤다면 yield
키워드를 알것이다.
사용해보면 yield 는 pause
의 느낌이다.
제너레이터는 다음 값이 될 것 next
를 그 자리에서 계산하여 내어준다.
제너레이터가 아니라면 메모리에 계산된 피보나치수열을 가지고 있던가, 매번 n번째까지 계산하던가 했어야 하는데
제너레이터를 사용하면 호출할때마다 한번씩 계산하고 그 문맥에서 정지해 있다고 보면 된다.
def fib(n):
curr, next = 0, 1
for _ in range(n):
curr, next = next, curr + next
return curr
def fib_generator():
curr, next = 0, 1
while True:
curr, next = next, curr + next
yield curr
fibo_gen = fib_generator()
next(fibo_gen) #1
next(fibo_gen) #1
next(fibo_gen) #2
next(fibo_gen) #3
next(fibo_gen) #5