함수형 프로그래밍에서 자주 쓰는 테크닉이 **인수 고정(Partial Application)**입니다. Python에서는 functools.partial로 손쉽게 구현할 수 있어요. 핵심 아이디어는 함수의 일부 인수를 미리 채워 넣어 새로운 함수를 만드는 것입니다. 이때 함수 자체를 값처럼 다루기 때문에(= 일급 객체) 변수에 담거나 인자로 전달하는 패턴이 아주 자연스럽습니다.
1. 가장 간단한 예제: 곱셈표 만들기
# partial 사용법: 인수고정 -> 콜백 함수 사용
from operator import mul
from functools import partial
# 인수 고정
five = partial(mul, 5) # 함수는 일급 객체이기 때문에 변수에 할당 가능
# 추가 고정
six = partial(five, 6) # 함수는 일급 객체이기 때문에 다른 함수의 인자로 전달 가능
print(five(10)) # 50
print(six()) # 30 (5 * 6)
print([five(i) for i in range(1, 11)]) # [5,10,15,20,25,30,35,40,45,50]
- five = partial(mul, 5): mul(x, y)의 첫 번째 인수를 5로 고정 → five(y)는 5 * y.
- six = partial(five, 6): 이제 남은 인수(두 번째)까지 6으로 고정 → six()는 5 * 6.
출력
50, 30
[5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
2. 콜백과 함께 쓰면 더 빛남
partial은 콜백 자리에 “인수가 덜 들어간 함수”를 넘겨야 할 때 특히 유용합니다.
1️⃣ map/filter 같은 함수형 도구
from functools import partial
from operator import mul
five = partial(mul, 5)
nums = [1, 2, 3, 4, 5]
print(list(map(five, nums))) # [5, 10, 15, 20, 25]
2️⃣ 정렬 시 key 함수에 인수 주고 싶을 때
from functools import partial
def startswith(prefix, s):
return s.startswith(prefix)
words = ["apple", "banana", "apricot", "blueberry"]
# "a"로 시작하는지 여부를 key로 사용 (True/False가 정렬 기준)
key_func = partial(startswith, "a")
print(sorted(words, key=key_func, reverse=True))
# ['apricot', 'apple', 'banana', 'blueberry']
3️⃣ 키워드 인수도 고정 가능
커스텀 함수라면 키워드 인수를 고정하는 게 가독성에 특히 좋습니다.
from functools import partial
def greet(greeting, name, punctuation="!"):
return f"{greeting}, {name}{punctuation}"
# greeting만 고정
hello = partial(greet, "안녕")
print(hello("철영")) # 안녕, 철영!
# name과 punctuation 고정
to_junhyung_exclaim = partial(greet, name="철영", punctuation="!!!")
print(to_junhyung_exclaim("반가워")) # 반가워, 철영!!!
3. “콜백(callback)”이란?
**콜백(callback)**은 말 그대로 **“다른 함수에 넘겨졌다가 나중에 불려지는 함수”**를 뜻합니다.
예를 들어:
def run_twice(func):
print(func(10))
print(func(20))
# five 함수를 run_twice의 인수로 전달
run_twice(five)
- 여기서 five는 run_twice 함수에 인자로 전달되었죠.
- run_twice 안에서 func(10) 같은 식으로 나중에 불려집니다.
- 이렇게 **“나중에 실행되라고 전달된 함수”**를 콜백이라고 부릅니다.
즉, 콜백은 어려운 개념이 아니라,
“함수를 값처럼 전달해서 필요할 때 불러주는 것”이라고 이해하시면 충분해요!
4. 언제 유용할까?
- 반복되는 특정 인수를 매번 쓰기 귀찮을 때 → partial로 고정
- 이벤트 처리 같은 곳에서 함수를 미리 준비해두고 전달해야 할 때
- map, filter, sorted 같은 함수에 인자로 함수를 넣을 때
정리하면
- partial은 함수의 인수를 미리 고정해서 새로운 함수를 만들어주는 도구
- 함수가 값처럼 다뤄지기 때문에(= 일급 객체) 변수에 담고, 전달하고, 리턴하는 게 가능
- 콜백은 그냥 “나중에 실행되라고 전달된 함수”
'파이썬 > 기초 프로그래밍' 카테고리의 다른 글
| 파이썬 클로저(Closure) 간단 이해 + 내부 구조 들여다보기 (0) | 2025.09.08 |
|---|---|
| __call__ 재정의: 클래스도 함수처럼 사용하기 (1) | 2025.09.07 |
| 일급 객체(First-class Object)란 무엇일까? (0) | 2025.09.07 |
| 파이썬 reduce로 배우는 누적 연산 (0) | 2025.09.07 |
| 파이썬에서 딕셔너리를 읽기 전용으로 만들기 — MappingProxyType (0) | 2025.09.07 |