클로저 함수 개념
클로저는 다음 두 가지 조건을 만족하는 함수입니다:
- 함수 내부에 정의된 내부 함수
- 내부 함수가 외부 함수의 변수를 참조함
def outer_function(username):
def inner_function():
print(username)
return inner_function
closure = outer_function('example_user')
closure() # example_user 출력
클로저의 실제 활용 예시
웹 페이지 데이터를 반복적으로 가져오는 상황에서 클로저를 사용하면 효율적입니다.
import requests
def create_fetcher(url):
def fetch_page():
response = requests.get(url)
return response.text
return fetch_page
# 특정 URL에 대한 데이터 가져오기 함수 생성
python_org_fetcher = create_fetcher('https://www.python.org')
# 동일한 페이지를 여러 번 요청
print(python_org_fetcher())
print(python_org_fetcher())
데코레이터 이해하기
데코레이터는 클로저, 함수 객체, 중첩 구조의 개념을 결합한 것으로, 원본 함수의 호출 방식이나 내부 코드를 변경하지 않고 새로운 기능을 추가할 수 있습니다.
데코레이터 구현 과정
import time
# 기본 함수 정의
def target_function(x, y, z):
time.sleep(2)
print(f'실행: {x}, {y}, {z}')
# 데코레이터 함수 생성
def timing_decorator(original_func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = original_func(*args, **kwargs)
end_time = time.time()
print(f'실행 시간: {end_time - start_time}초')
return result
return wrapper
# 함수에 데코레이터 적용
target_function = timing_decorator(target_function)
target_function(10, 20, 30)
데코레이터 개선 버전
import time
def home_function():
time.sleep(2)
print('home 함수 실행')
return 'home 함수 결과값'
def execution_timer(func):
def timer_wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f'실행 소요 시간: {end - start}초')
return result
return timer_wrapper
# 데코레이터 적용
decorated_home = execution_timer(home_function)
result = decorated_home()
print(result)
표준 데코레이터 템플릿
from functools import wraps
def standard_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print('함수 실행 전 작업')
result = func(*args, **kwargs)
print('함수 실행 후 작업')
return result
return wrapper
데코레이터 문법 설탕 사용
import time
@standard_decorator
def sample_function():
'''샘플 함수입니다.'''
time.sleep(1)
print('샘플 함수 실행')
return '결과값'
sample_function()
반환값 처리
def calculate_sum(a, b):
total = a + b
return total
result = calculate_sum(5, 3)
print(result) # 8 출력