functools: partial과 reduce
partial로 특화된 함수를 만들고 reduce로 시퀀스를 접습니다.
functools: partial과 reduce은(는) CoddyKit의 무료 Python Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Python Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
functools 개요
functools는 다른 함수를 대상으로 작업하거나 다른 함수를 반환하는 고차 함수를 모아 둔 표준 라이브러리 모듈입니다.
import functools
# partial, reduce, lru_cache, wraps, cached_property ...
print(dir(functools))partial()
functools.partial(func, *args, **kw)는 일부 인수가 미리 채워진 새로운 호출 가능 객체를 만듭니다.
import functools
def power(base, exp):
return base ** exp
square = functools.partial(power, exp=2)
cube = functools.partial(power, exp=3)
print(square(4)) # 16
print(cube(3)) # 27메서드와 partial 사용하기
partial을 사용하면 고정된 매개변수를 가진 메서드를 콜백이나 이벤트 처리기로 사용할 수 있습니다.
import functools, logging
logger = logging.getLogger("app")
log_error = functools.partial(logger.log, logging.ERROR)
log_error("Something went wrong")partial과 lambda 비교
인수를 미리 채울 때는 lambda보다 partial을 사용하는 편이 좋습니다. partial은 피클링할 수 있고, 보기 좋은 repr을 제공하며, 문서 문자열을 보존하기 때문입니다.
import functools
mul = lambda x, y: x * y
double_lambda = lambda x: mul(x, 2) # lambda approach
double_partial = functools.partial(mul, y=2) # partial approach
print(double_partial(5)) # 10reduce()
functools.reduce(func, iterable, initial)은 이항 함수를 사용하여 반복 가능한 객체를 왼쪽에서 오른쪽으로 누적합니다.
import functools, operator
total = functools.reduce(operator.add, [1,2,3,4,5])
print(total) # 15
product = functools.reduce(operator.mul, [1,2,3,4,5], 1)
print(product) # 120reduce로 max() 만들기
reduce를 다시 구현하여 max()를 만드는 방식으로 사용법을 살펴보겠습니다.
import functools
def my_max(seq):
return functools.reduce(lambda a, b: a if a > b else b, seq)
print(my_max([3, 1, 4, 1, 5, 9])) # 9중첩 목록 평탄화하기
reduce와 operator.iconcat을 사용하면 중첩을 한 단계 평탄화할 수 있습니다.
import functools, operator
nested = [[1,2],[3,4],[5]]
flat = functools.reduce(operator.iconcat, nested, [])
print(flat) # [1, 2, 3, 4, 5]URL을 만들 때 partial 사용하기
실용적인 partial 패턴은 기본 URL을 고정하고 특화된 요청 도우미를 만드는 것입니다.
import functools, urllib.request
def fetch(base, path):
url = base.rstrip("/") + "/" + path.lstrip("/")
with urllib.request.urlopen(url) as r:
return r.read()
github = functools.partial(fetch, "https://api.github.com")
# github("/users/octocat")wraps(): 메타데이터 보존하기
데코레이터를 작성할 때는 @functools.wraps(wrapped)를 사용하여 래퍼가 원래 함수의 이름과 문서 문자열을 보존하도록 하십시오.
import functools
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
return func(*args, **kw)
return wrapper
@decorator
def greet(name):
"""Say hello."""
return f"Hello, {name}"
print(greet.__name__) # greet
print(greet.__doc__) # Say hello.total_ordering
@functools.total_ordering은 __eq__와 __lt__/__le__/__gt__/__ge__ 중 하나를 정의하면 누락된 비교 메서드를 채워 줍니다.
import functools
@functools.total_ordering
class Version:
def __init__(self, major, minor):
self.v = (major, minor)
def __eq__(self, o): return self.v == o.v
def __lt__(self, o): return self.v < o.v
print(Version(1,2) >= Version(1,1)) # Truesingledispatch
@functools.singledispatch는 첫 번째 인수의 형식에 따라 서로 다른 구현으로 분배하는 함수를 만듭니다.
import functools
@functools.singledispatch
def process(arg):
raise NotImplementedError(type(arg))
@process.register(int)
def _(n): return n * 2
@process.register(str)
def _(s): return s.upper()
print(process(5)) # 10
print(process("hi")) # HI빠른 확인
functools.partial(pow, 2)는 무엇을 만듭니까?
복습
partial은 함수 인수를 미리 채우고, reduce는 이항 함수로 수열을 누적하며, wraps는 데코레이터 메타데이터를 보존합니다. total_ordering은 비교 메서드를 채우고, singledispatch는 형식에 따라 함수를 분배합니다.
자주 묻는 질문
“functools: partial과 reduce” 강의는 무료인가요?
네 — “functools: partial과 reduce” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Python Academy 강의 전체를 잠금 해제할 수 있습니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“functools: partial과 reduce”에서 뭘 배우나요?
partial로 특화된 함수를 만들고 reduce로 시퀀스를 접습니다. 브라우저에서 직접 실행하는 실습 코드로 Python Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Python Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Python Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“functools: partial과 reduce” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Python Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Python Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- itertools: 무한 및 유한 반복자
- itertools: 조합론
- functools: partial과 reduce
- functools: lru_cache와 cached_property