# 클로저 기초
# 파이선 변수 범위(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가 뒤에 있는데 절차상 먼저 사용을 하게 되면 에러를 뛰운다.
서버 프로그래밍 → 동시성(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))