파이썬

[파이썬] 클로저

코딩라이프 2022. 11. 21. 10:46
클로저란, 자신을 둘러싼 스코프(네임스페이스)의 상태값을 기억하는 함수입니다.


  • 내부함수는 외부함수의 지역변수에 접근 할 수 있는데 외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도 내부함수가 외부함수의 변수에 접근 할 수 있다. 이러한 메커니즘을 클로저라고 합니다.
  • 클로저를 만들기 위해서는 다음 세가지 조건을 만족해야 합니다.
    1. 클로저는 어떤 함수 내의 중첩된 함수이다.
    2. 클로저는 자신을 둘러싼(enclose) 함수 내의 상태값을 참조한다.
    3. 클로저를 둘러싼 enclose 함수는 클로저를 반환한다.
  • 아래 코드의 calc_square 함수는 클로저를 만들기위한 다음 세가지 조건을 만족하므로, 클로저입니다.
    1. cal_square 함수는 함수 calc에 중첩된 함수이다.
    2. cal_square 함수는 자신을 둘러싸고 있는 calc 함수의 지역변수 n을 사용한다.
    3. cal_square 함수를 둘러싼 calc 함수는 cal_square함수를 반환한다.

def calc():
    n = 2
    def cal_square(x):
        return x**n
    return cal_square

f = calc()
print(f(1),f(2),f(3),f(4),f(5))

[ 실행결과 ]

1 4 9 16 25

 

  • 위 코드의 실행 순서를 따라가보겠습니다.
    1. calc 함수를 호출한 뒤 반환값을 f에 저장합니다. → f에는 cal_square가 들어갑니다.
    2. f에 숫자를 인수로 넘겨 호출합니다. → f에는 cal_square가 들어가있으므로 cal_square(숫자)의 형태로 호출합니다.
    3. 함수 calc는 끝났지만 f는 calc의 변수 n의 값을 사용하여 계산된 값을 리턴합니다.

 


■ lambda로 클로저 만들기

  • 위 코드를 lambda 표현식으로 변경해보면 다음과 같습니다.
    • 함수 대신 익명함수를 반환합니다.
    • 람다표현식 자체가 클로저가 됩니다.
def calc():
    n = 2
    return lambda x: x**n    # 람다 표현식을 반환
 
c = calc()
print(c(1), c(2), c(3), c(4), c(5))

[ 실행결과 ]

1 4 9 16 25