파이썬 부분 함수(Partial Function)란?
누구나 재사용 가능한 코드를 작성하고 싶어 합니다. 그렇다면 부분 함수(partial function)는 꼭 배워둘 만한 유용한 기능입니다. 부분 함수를 사용하면 여러 개의 매개변수를 가진 함수에서 일부 인자를 고정값으로 미리 지정하여, 매개변수가 더 적은 새로운 함수를 손쉽게 파생시킬 수 있습니다.
파이썬에서는 표준 라이브러리인 functools를 통해 부분 함수 적용(partial function application)을 구현할 수 있습니다. 아래는 functools의 partial과 operator 모듈의 add 함수를 활용한 간단한 예제입니다.
>>> from functools import * >>> from operator import * >>> add(1, 2) 3 >>> add1 = partial(add, 4) >>> add1(6) 10 >>> add1(10) 14
partial은 map이나 filter처럼 함수를 입력으로 받는 고차 함수(higher-order function)입니다. 동시에 프로그램 내 다른 함수와 똑같은 방식으로 사용할 수 있는 새로운 함수를 반환하기 때문에, 반환된 함수를 자유롭게 조합하거나 전달할 수 있습니다.
>>> list(map(add1, [1, 2, 3, 4, 5])) [5, 6, 7, 8, 9] >>> seven = partial(add1, 3) >>> seven() 7
위 예제에서 add1은 첫 번째 인자가 4로 고정된 함수이며, 이를 map에 넘겨 리스트의 모든 요소에 일괄 적용했습니다. 나아가 partial을 중첩하면 두 인자가 모두 고정된 함수도 만들 수 있습니다.
객체 메서드에 부분 함수 적용하기
부분 함수는 일반 함수뿐 아니라 객체의 메서드에도 적용할 수 있습니다. 예를 들어, 문자열 치환 시 대상 단어만 바꿔가며 호출하는 기본 문자열 목록을 생성할 때 유용하게 쓰입니다.
>>> str1 = "Hello, Python"
>>> helloStr = partial(str1.replace, "Python")
>>> helloStr("Tutorialspoint")
'Hello, Tutorialspoint'
>>> helloStr("Java")
'Hello, Java'
str1.replace 메서드의 첫 번째 인자를 "Python"으로 고정해 두면, 교체할 문자열만 인자로 넘겨 반복 작업을 깔끔하게 처리할 수 있습니다.
부분 함수의 장점과 활용 분야
부분 함수 적용은 다음과 같은 상황에서 특히 빛을 발합니다.
- 하나의 객체나 함수에 다양한 입력값을 반복적으로 적용해야 할 때
- 함수의 특정 인자를 상수로 고정한 채 나머지 인자만 유연하게 사용하고 싶을 때
- 콜백 함수나 이벤트 핸들러에 추가 인자를 미리 바인딩해야 할 때
이처럼 파이썬의 부분 함수를 잘 활용하면 중복 코드를 줄이고 코드를 더 쉽게 작성할 수 있으며, 유지보수 또한 한결 수월해집니다.