0Pricing
Python Academy · 강의

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))   # 10

reduce()

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) # 120

reduce로 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))  # True

singledispatch

@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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. itertools: 무한 및 유한 반복자
  2. itertools: 조합론
  3. functools: partial과 reduce
  4. functools: lru_cache와 cached_property
← Python Academy(으)로 돌아가기