250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- shuffle()
- mro()
- inplace()
- glob
- count()
- 오버라이딩
- fnmatch
- __sub__
- 파이썬
- zipfile
- View
- locals()
- node.js
- HTML
- fileinput
- CSS
- __len__
- remove()
- Database
- MySQL
- discard()
- decode()
- items()
- shutil
- choice()
- MySqlDB
- __annotations__
- __getitem__
- JS
- randrange()
Archives
- Today
- Total
흰둥이는 코드를 짤 때 짖어 (왈!왈!왈!왈!왈!왈!왈!왈!왈!왈!왈!)
(파이썬) 클로저와 데코레이터 본문
728x90
반응형
1. 클로저(Closure)
- 함수 안의 함수를 결과로 반환할 때, 그 내부 함수를 클로저라고 함
- 콜백함수, 함수의 순차적 실행, 데코레이터 함수에 사용
In [1]:
def mul2(n):
return n * 2
In [2]:
mul2(10)
Out[2]:
20
In [3]:
mul2(5)
Out[3]:
10
In [4]:
def mul5(n):
return n * 5
In [5]:
mul5(10)
Out[5]:
50
In [6]:
mul5(5)
Out[6]:
25
In [7]:
# mul1, mul2, mul3 ... mul100도 만들어야 하나?
class Mul:
def __init__(self, m):
self.m = m
def mul(self, n):
return self.m * n
In [8]:
mul2 = Mul(2)
print(mul2.mul(10))
print(mul2.mul(5))
20
10
In [9]:
mul5 = Mul(5)
print(mul5.mul(10))
print(mul5.mul(5))
50
25
- 위에 코드를 좀더 간단하게 사용하기 위한 방법을 살펴보자.
In [15]:
class Mul:
def __init__(self, m): # 객체를 생성할 때 자동으로 호출
print('생성자 호출')
self.m = m
def __call__(self, n): # 객체를 실행할 때 자동으로 호출
print('call 호출')
return self.m * n
In [16]:
mul2 = Mul(2)
생성자 호출
In [17]:
mul2(10)
call 호출
Out[17]:
20
In [18]:
mul5 = Mul(5)
mul5(10)
생성자 호출
call 호출
Out[18]:
50
- __call__을 이용하는 방법보다 더 간결하게 하기위해 클로저를 사용한다.
In [19]:
# 클로저 사용하기
def mul(m): # 외부 함수
def wrapper(n): # 내부 함수(클로저)
return m * n
return wrapper
In [20]:
mul2 = mul(2) # m = 2인 wrapper 함수가 mul2에 저장
print(mul2(10)) # m = 2, n = 10인 wrapper 함수가 실행
20
In [21]:
mul5 = mul(5)
print(mul5(10))
50
2. 데코레이터(Decorator)
- 함수를 꾸며주는 함수
- 함수를 인수로 받는 클로저
- @(어노테이션)을 이용하여 사용
- 반복되는 작업을 여러 함수에 적용할 경우, 기존 함수를 수정하지 않고 추가 기능을 구현하고 싶은 경우 사용
In [22]:
import time
def func1(a, b):
start = time.time()
print('함수가 시작되었습니다')
result = a + b
end = time.time()
print(f'함수 수행시간: {end - start}')
return result
In [23]:
result = func1(10, 3)
print(result)
함수가 시작되었습니다
함수 수행시간: 6.389617919921875e-05
13
In [27]:
print(format(6.389617919921875e-05, 'f'))
0.000064
In [28]:
def func2(a, b):
start = time.time()
print('함수가 시작되었습니다')
result = a * b
end = time.time()
print(f'함수 수행시간: {end - start}')
return result
In [29]:
result = func2(10, 3)
print(result)
함수가 시작되었습니다
함수 수행시간: 5.6743621826171875e-05
30
In [30]:
print(format(5.6743621826171875e-05, 'f'))
0.000057
In [31]:
# 데코레이터 만들기
def func1(a, b):
result = a + b
return result
def func2(a, b):
result = a * b
return result
In [32]:
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
In [33]:
deco1 = elapsed(func1)
result = deco1(10, 3)
print(result)
함수가 시작되었습니다
함수 수행시간: 7.605552673339844e-05
13
In [34]:
deco2 = elapsed(func2)
result = deco2(10, 3)
print(result)
함수가 시작되었습니다
함수 수행시간: 0.0008656978607177734
30
In [35]:
@elapsed
def func1(a, b):
result = a + b
return result
@elapsed
def func2(a, b):
result = a * b
return result
In [36]:
result = func1(10, 3)
print(result)
함수가 시작되었습니다
함수 수행시간: 0.0010592937469482422
13
In [37]:
result = func2(10, 3)
print(result)
함수가 시작되었습니다
함수 수행시간: 0.00042128562927246094
30
728x90
반응형
'파이썬 기초' 카테고리의 다른 글
(파이썬) 파일 입출력 라이브러리 (0) | 2023.03.14 |
---|---|
(파이썬) 변수 타입 어노테이션 (0) | 2023.03.13 |
(파이썬) 파일 입출력 (0) | 2023.03.13 |
(파이썬) 예외 처리 (1) | 2023.03.13 |
(파이썬) 모듈 (0) | 2023.03.10 |