1. 클로저(Closure)
- 함수 안의 함수를 결과로 반환할 때, 그 내부 함수를 클로저라고 함
- 콜백함수, 함수의 순차적 실행, 데코레이터 함수에 사용
def mul2(n):
return n * 2
mul2(10) # 20
mul2(5) # 10
def mul5(n):
return n * 5
mul5(10) # 50
mul5(5) # 25
# mul1, mul2, mul3 ... mul100도 만들어야 하나?
# 클래스 이용하기
class Mul:
def __init__(self, m):
self.m = m
def mul(self, n):
return self.m * n
mul2 = Mul(2)
print(mul2.mul(10)) # 20
print(mul2.mul(5)) # 10
mul5 = Mul(5)
print(mul5.mul(10)) # 50
print(mul5.mul(5)) # 25
class Mul:
def __init__(self, m): # 객체를 생성할 때 자동으로 호출
print('생성자 호출')
self.m = m
# __call__ 머신러닝, 딥러닝에서 많이 사용
def __call__(self, n): # 객체를 실행할 때 자동으로 호출
print('call 호출')
return self.m * n
mul2 = Mul(2) # 생성자 호출
mul2(2)
'''
call 호출
4
'''
mul5 = Mul(5) # 생성자 호출
mul5(10)
'''
call 호출
50
'''
# 클로저 사용하기
def mul(m): # 외부 함수
def wrapper(n): # 내부 함수(클로저)
return m * n
return wrapper
mul2 = mul(2) # m = 2 인 wrapper 함수가 mul2에 저장
print(mul2(10)) # m = 2, n = 10인 wrapper 함수가 실행
# 20
mul5 = mul(5)
print(mul5(10))
# 50
2. 데코레이터(Decorator)
- 함수를 꾸며주는 함수
- 함수를 인수로 받는 클로저
- @(어노테이션)를 이용하여 사용
- 반복되는 작업을 여러 함수에 적용할 경우, 기존 함수를 수정하지 않고 추가 기능을 구현하고 싶은 경우
import time # time 운영체제의 시간을 다룰 수 있게 해주는 라이브러리
def func1(a, b):
start = time.time()
print('함수가 시작되었습니다')
result = a + b
end = time.time()
print(f'함수 수행시간 : {end - start}')
return result
result = func1(10, 3)
'''
함수가 시작되었습니다
함수 수행시간 : 7.224082946777344e-05
'''
print(result) # 13
print(format(7.224082946777344e-05, 'f')) # 0.000072
def func2(a, b):
start = time.time()
print('함수가 시작되었습니다')
result = a * b
end = time.time()
print(f'함수 수행시간 : {end - start}')
return result
result = func2(10, 3)
'''
함수가 시작되었습니다
함수 수행시간 : 0.0015358924865722656
'''
print(result) # 30
# 데코레이터 만들기
def elapsed(func):
def wrapper(a, b):
start = time.time()
print('함수가 시작되었습니다')
result = func(a, b)
end = time.time()
print(f'함수 수행시간 : {end - start}')
return result
return wrapper
deco1 = elapsed(func1)
result = deco1(10, 3)
'''
함수가 시작되었습니다
함수 수행시간 : 0.0005011558532714844
'''
print(result) # 13
deco2 = elapsed(func2)
result = deco2(10, 3)
'''
함수가 시작되었습니다
함수 수행시간 : 9.250640869140625e-05
'''
print(result) # 30
@elapsed
def func1(a, b):
result = a + b
return result
@elapsed
def func2(a, b):
result = a * b
return result
result = func1(10,3)
'''
함수가 시작되었습니다
함수 수행시간 : 0.00012969970703125
'''
print(result) # 13
result = func2(10,3)
'''
함수가 시작되었습니다
함수 수행시간 : 6.842613220214844e-05
'''
print(result) # 30