클로저 기초(Closure)


파이썬 변수 범위 (Scope)와 globa 선언

# 클로저 기초

# 파이선 변수 범위(scope)

def func_v1(a):
    print(a)
    print(b)

# func_v1(10)

b = 20

def func_v2(a):
    print(a)
    print(b)

func_v2(10)

c = 30

# def func_v3(a):
#     print(a)
#     print(c)
#     c = 40

# func_v3(10) #에러가 뜬다 왜냐하면 로컬에 있는데 순서가 틀리기 때문에

def func_v3(a):
    global c
    print(a)
    print(c)
    c = 40

print('>>', c)
func_v3(10)
print('>>>', c)

scope는 다음과 같다. 주석으로 처리된 코드를 보면 c가 밖에 있고 변수 안에 c가 뒤에 있는데 절차상 먼저 사용을 하게 되면 에러를 뛰운다.

클로저 (Closure)

서버 프로그래밍 → 동시성(Concurrency) 제어 → 메모리 공간에 여러 자원이 접근 → 교착상태 (Dead Lock

클로저는 Scope가 끝나도 값을 기억한다.

파이썬에서는 메모리를 공유하지 않고 메시지 전달로 처리한다. (다른 언어도 이씩는 하다 Erlang)

클로저는 공유하되 변경되지 않는(Immutable, Read Only) 적극적으로 사용 → 함수형 프로그래밍

결론 : 클로저는 불변자료구조 및 Atom, STM → 멀티스레드(Coroutine) 프로그래밍에 강점을 장점


# 클래스 이용
class Averager():
    def __init__(self):
        self._series = []

    def __call__(self, v): # 함수 처럼 사용할 수 있는..
        self._series.append(v)
        print('inner >> {} / {}'.format(self._series, len(self._series)))
        return sum(self._series) / len(self._series)

# 인스턴스 생성
averager_cls = Averager()

# print(dir(averager_cls))
# 누적
print(averager_cls(10))
print(averager_cls(30))
print(averager_cls(50))
print(averager_cls(190))