클로저란, 자신을 둘러싼 스코프(네임스페이스)의 상태값을 기억하는 함수입니다.
- 내부함수는 외부함수의 지역변수에 접근 할 수 있는데 외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도 내부함수가 외부함수의 변수에 접근 할 수 있다. 이러한 메커니즘을 클로저라고 합니다.
- 클로저를 만들기 위해서는 다음 세가지 조건을 만족해야 합니다.
- 클로저는 어떤 함수 내의 중첩된 함수이다.
- 클로저는 자신을 둘러싼(enclose) 함수 내의 상태값을 참조한다.
- 클로저를 둘러싼 enclose 함수는 클로저를 반환한다.
- 아래 코드의 calc_square 함수는 클로저를 만들기위한 다음 세가지 조건을 만족하므로, 클로저입니다.
- cal_square 함수는 함수 calc에 중첩된 함수이다.
- cal_square 함수는 자신을 둘러싸고 있는 calc 함수의 지역변수 n을 사용한다.
- 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
- 위 코드의 실행 순서를 따라가보겠습니다.
- calc 함수를 호출한 뒤 반환값을 f에 저장합니다. → f에는 cal_square가 들어갑니다.
- f에 숫자를 인수로 넘겨 호출합니다. → f에는 cal_square가 들어가있으므로 cal_square(숫자)의 형태로 호출합니다.
- 함수 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
'파이썬' 카테고리의 다른 글
오늘날의 데이터 중심 세상에서 데이터 분석의 중요성 (0) | 2023.05.01 |
---|---|
[파이썬]셀레니움(selenium), 드롭다운박스 선택 (0) | 2022.11.22 |
[파이썬] 함수 내에 함수가 정의되어 있는 경우 지역변수 사용 (0) | 2022.11.20 |
[파이썬] 함수에서 변수의 사용 범위 (0) | 2022.11.20 |
[파이썬] 함수, 퍼스트 클래스 함수 (0) | 2022.11.19 |