## closure
함수를 둘러싼 환경을 유지했다가 나중에 다시 사용하는 함수
ex)
```py
def calc():
a = 3
b = 5
def mul_add(x):
return a * x + b
return mul_add
```
함수`calc()`내에서는 함수 `mul_add()`를 만든 뒤 바로 호출하지 않고 return으로 함수를 반환한다.
(함수를 반환할 때에는 함수 이름만 반환해야하며 () 를 붙이면 안 된다.)
위의 클로저를 사용
```py
c = calc()
print(c(1), c(2), c(3), c(4), c(5)) # 8 11 14 17 20
```
함수 calc가 끝났음에도 지역 변수 a,b를 사용해서 계산한다.
이렇게 함수를 둘러싼 환경(지역 변수, 코드 등)을 유지하다가 함수를 호출할 때 다시 꺼내서 사용하는 함수를 클로저(closure)라고 한다.
변수 c 에 저장된 `calc`함수가 클로저이다.
[클로저 참고](https://blog.hexabrain.net/347)
2021.12.02 추가 공부
다른 구문들과 마찬가지로 함수도 함수안에 중첩되어 선언 가능하다.
def parent_function():
def child_function():
print("this is a child function")
child_function()
parent_function()
> "this is a child function"
중첩함수 혹은 내부함수 는 상위 부모 함수 내에서만 호출 가능하다.
함수를 사용하는 이유 중 하나는 반복되는 코드를 함수로 정의해 가독성을 높이고 코드 관리를 효율적으로 하기 위해서이다.
def print_all_elements(list_of_things):
## 중첩함수 선언
def print_each_element(things):
for thing in things:
print(thing)
if len(list_of_things) > 0:
print_each_element(list_of_things)
else:
print("There is nothing!")
중첩 함수가 부모 함수의 변수나 정보를 가두어 사용하는 것을 closure
라고 한다.
그리고 부모함수는 중첩 함수를 return한다.
그러면 부모함수의 변수를 외부로부터의 직접 접근은 피하면서 중첩함수를 통해서 부모함수의 변수를 사용한 연산을 할 수 있다.
closure는,
어떤 정보를 기반으로 연산을 실행하되 그 정보의 접근을 제한하는 방법이다.
주로 factory패턴을 구현할 때 사용한다.
▼ 특정숫자의 제곱값을 구하는 함수 구현
def generate_power(base_number):
def nth_power(power):
return base_number ** power
return nth_power
calculate_power_of_two = generate_power(2)
calculate_power_of_two(7)
> 128
calculate_power_of_two(10)
> 1024
calculate_power_of_seven = generate_power(7)
calculate_power_of_seven(3)
> 343
calculate_power_of_seven(5)
> 16907