파이썬의 클로저
클로저(closure)는 함수와 그 함수가 접근 가능한 모든 외부 변수들을 함께 의미합니다.
파이썬에서 "함수의 클로저"라고 말할 때 대개 그 함수 자체가 아니라 정확히 그 함수의 외부 변수들을 가리킵니다.
다음과 같이 변수 i를 선언하고
내부 함수 inner가 정의된 함수
outer가 있다고 가정해 보겠습니다.
내부 함수에서는 i에 1을 더합니다.
변수 i가 올바르게 동작하도록 하기 위해
nonlocal 지시자를 추가합니다:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
이제 외부 함수를 변수 res에 할당하고
괄호를 붙여 호출해 봅시다:
res = outer()
res() # 1을 출력함
res를 여러 번 호출해 보겠습니다.
코드를 실행할 때마다 카운터 i가
1씩 증가할 것입니다:
res() # 2를 출력함
res() # 3을 출력함
res() # 4를 출력함
그러나 여기에는 중요한 뉘앙스가 있습니다 -
함수 outer를 호출할 때마다 각각의
자체 카운터가 증가합니다. 첫 번째
outer 호출을 변수 res1에,
두 번째 호출을 변수 res2에
기록해 보겠습니다. 그런 다음 순서대로
콘솔에 출력해 보겠습니다:
res1 = outer()
res1() # 1을 출력함
res1() # 2를 출력함
res1() # 3을 출력함
res2 = outer()
res2() # 1을 출력함
res2() # 2를 출력함
res2() # 3을 출력함
다음 코드가 주어집니다:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
콘솔에 무엇이 출력될지 말하세요.
호출할 때마다 다음 피보나치 수를 반환하는 함수를 만드세요.
주어진 범위 내에서 임의의 정수를 반환하지만, 연속으로 두 번 동일한 수가 나오지 않도록 하는 함수를 만드세요.