728x90
functools는 함수형 프로그래밍을 돕기 위한 표준 라이브러리 모듈로, 데코레이터, 메모이제이션, 부분 적용 등 다양한 기능을 제공합니다. 이 장에서는 실무에서 자주 활용되는 functools
의 대표 기능들을 정리합니다.
● lru_cache로 결과 캐싱하기
lru_cache
는 함수의 실행 결과를 캐시하여 동일한 인자로 호출될 때 빠르게 결과를 반환합니다.
from functools import lru_cache
@lru_cache(maxsize=128)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
print(fib(30)) # 매우 빠르게 계산
maxsize는 캐시 가능한 최대 항목 수를 지정하며, None으로 설정하면 무한 캐시입니다.
● partial로 인자 고정 함수 만들기
from functools import partial
def multiply(x, y):
return x * y
double = partial(multiply, 2)
print(double(5)) # 10
partial을 사용하면 기본 인자를 고정한 새로운 함수를 만들 수 있습니다.
● cmp_to_key로 커스텀 정렬하기
기존의 cmp
스타일 비교 함수를 key
함수로 변환할 때 사용합니다.
from functools import cmp_to_key
def compare(a, b):
return a - b
sorted_list = sorted([3, 1, 2], key=cmp_to_key(compare))
print(sorted_list) # [1, 2, 3]
● total_ordering으로 비교 연산 자동화
total_ordering
을 사용하면 __eq__
와 하나의 비교 연산자만 정의해도 나머지 비교 메서드가 자동 생성됩니다.
from functools import total_ordering
@total_ordering
class Person:
def __init__(self, age):
self.age = age
def __eq__(self, other):
return self.age == other.age
def __lt__(self, other):
return self.age < other.age
이제 Person 객체는 <
, <=
, >
, >=
등 비교 연산자를 사용할 수 있게 됩니다.
● wraps로 데코레이터 메타데이터 유지
from functools import wraps
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
@wraps
를 사용하면 원래 함수의 이름, docstring, 모듈 정보를 유지할 수 있어 디버깅이 용이합니다.
● 마무리
functools는 간결하고 효율적인 함수형 스타일의 프로그래밍을 도와줍니다. 특히 데코레이터와 캐싱 기능은 실무에서도 자주 쓰이는 기능이므로 꼭 익혀두어야 할 필수 도구입니다.
728x90
'프로그래밍언어 > 파이썬[중급]' 카테고리의 다른 글
[파이썬][중급] Chapter35. datetime과 시간 처리 심화 (0) | 2025.05.24 |
---|---|
[파이썬][중급] Chapter34. operator 모듈과 연산 함수 (0) | 2025.05.24 |
[파이썬][중급] Chapter32. itertools 고급 패턴 (0) | 2025.05.24 |
[파이썬][중급] Chapter31. 데코레이터 중첩과 인자 전달 (0) | 2025.05.24 |
[파이썬][중급] Chapter30. 고차 함수와 partial 함수 (0) | 2025.05.23 |