Python-클로저(closure)

강현구·2021년 11월 27일
0

Python

목록 보기
7/21
## 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 추가 공부

1. 중첩 함수(Nested Function)

다른 구문들과 마찬가지로 함수도 함수안에 중첩되어 선언 가능하다.

def parent_function():
    def child_function():
        print("this is a child function")

    child_function()

parent_function()
> "this is a child function"

중첩함수 혹은 내부함수 는 상위 부모 함수 내에서만 호출 가능하다.

중첩함수를 쓰는 이유

  1. 가독성
  2. closure

2. 가독성

함수를 사용하는 이유 중 하나는 반복되는 코드를 함수로 정의해 가독성을 높이고 코드 관리를 효율적으로 하기 위해서이다.

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!")

3. closure

중첩 함수가 부모 함수의 변수나 정보를 가두어 사용하는 것을 closure라고 한다.
그리고 부모함수는 중첩 함수를 return한다.
그러면 부모함수의 변수를 외부로부터의 직접 접근은 피하면서 중첩함수를 통해서 부모함수의 변수를 사용한 연산을 할 수 있다.

  1. 중첩 함수가 부모함수의 변수나 정보를 중첩 함수 내에서 사용한다.
  2. 부모 함수는 리턴값으로 중첩 함수를 리턴한다.
  3. 부모 함수에서 리턴했으므로 부모 함수의 변수는 직접적인 접근이 불가능하지만 부모 함수가 리턴한 중첩 함수를 통해서 사용될 수 있다.

closure는,
어떤 정보를 기반으로 연산을 실행하되 그 정보의 접근을 제한하는 방법이다.
주로 factory패턴을 구현할 때 사용한다.

  • 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

closure

profile
한걸음씩

0개의 댓글