1 분 소요

※ Closure (클로저)

  • 함수 안에 내부 함수를 구현하고, 그 내부 함수를 리턴하는 함수


■ Closure 예시

# e.g.

# 일반적인 class를 이용한 함수
> class Mul:
    def __init__(self, m):
        self.m = m
    def __call__(self, n):
        return self.m * n

> mul3 = Mul(3)
> mul5 = Mul(5)

> print(mul3(10)) # 30
> print(mul5(10)) # 50


# Closure
> def Mul(m):           # 외부 함수
    def wrapper(n):     # 내부 함수
        return m * n
    return wrapper      # 내부 함수를 리턴

> mul3 = Mul(3)
> mul5 = Mul(5)

> print(mul3(10)) # 30
> print(mul5(10)) # 50


※ Decorator (데코레이터)

  • 기존 함수를 바꾸지 않고, 새로운 기능을 추가할 수 있게 만드는 closure(클로저)
  • 함수명 바로 위에 (@+함수명)을 이용해 데코레이터를 사용가능하다.


■ Decorator 예시

# e.g.
# decorator를 이용하여 함수의 실행 시간 출력
# 한번만 구현해 두면, 여러 함수들의 실행 시간을 출력할 수 있음

> import time

> def elapsed(original_func):                          # 기존 함수를 인자로 받음
    def wrapper():
        start = time.time()
        result = original_func()                       # 기존 함수 수행
        end = time.time()

        print('함수 실행시간: %.4f초' %(end-start))     # 기존 함수의 수행 시간 출력
        return result                                  # 기존 함수의 수행 결과 리턴
    return wrapper

> def myfunc():
    print('함수실행')

> deco = elapsed(myfunc)
> deco()
# 함수실행
# 함수 실행시간: 0.0001초


# (@+함수명)으로 데코레이터 사용하기
> @elapsed
> def myfunc2():
     print('함수실행2')

> myfunc2()
# 함수실행2
# 함수 실행시간: 0.0041초


□ 입력 인수에 상관없이 데코레이터 수행

  • *args / **kwargs 매개변수 이용
> def elapsed(original_func):                           # 기존 함수를 인자로 받음
    def wrapper(*args, **kwargs):                       # *args, **kwargs 매개변수 추가
        start = time.time()
        result = original_func(*args, **kwargs)         # *args, **kwargs를 입력 인수로 기존 함수 수행
        end = time.time()

        print('함수 실행시간: %.4f초' %(end-start))      # 기존 함수의 수행 시간 출력
        return result                                   # 기존 함수의 수행 결과 리턴
    return wrapper

> @elapsed
> def myfunc(msg):
    print('함수실행 + msg: %s' % msg)

> myfunc('MESSAGE')
# 함수실행 + msg: MESSAGE
# 함수 실행시간: 0.0007초

댓글남기기