클로저 심화


외부에서 호출된 함수 변수값, 상태(레퍼런스) 복사 후 저장 → 후에 접근(엑서스) 가능

클로저 예제

# Clouser 사용
def closure_ex1(): # 함수 결과 반환
    # Free variable 자유 변수
    seriese = []
    def averager(v):
        seriese.append(v)
        print('inner >> {} / {}'.format(seriese, len(seriese)))
        return sum(seriese) / len(seriese)
    return averager

avg_clouser1 = closure_ex1()

print(avg_clouser1)

print(avg_clouser1(10))
print(avg_clouser1(30))
print(avg_clouser1(50))

# function ispaction
print(dir(avg_clouser1))
print(dir(avg_clouser1.__code__))
print(avg_clouser1.__code__.co_freevars)
print(avg_clouser1.__closure__[0].cell_contents) # [10, 30, 50]

나쁜 예제의 예시

# 잘못된 클로저 사용
def closuer_ex2():
    # free varialbe
    cnt = 0
    total = 0

    def averager(v):
        cnt += 1
        total += v
        return  total / v
    return averager

avg_clouser2 = closuer_ex2()
# print(avg_clouser2(10)) 에러가 발생합니다.

def closuer_ex3():
    # free varialbe
    cnt = 0
    total = 0

    def averager(v):
        nonlocal cnt, total
        cnt += 1
        total += v
        return  total / cnt
    return averager

avg_clouser3 = closuer_ex3()

print(avg_clouser3(15))
print(avg_clouser3(35))
print(avg_clouser3(40))

<aside> 💡 global 함수를 많이 쓰는 건 권장하지 않는다.

</aside>