Jost Do It.

그냥 IT해.

Programming/Python

[Python] functools의 partial 함수 알아보기

그냥하Jo. 2022. 9. 25. 00:00
반응형

partial 함수는 functools package에서 제공하는 함수로,

 

functools package 유용한 여러가지 함수들을 제공하는 라이브러리다.

 

 

이 글에서는 functools 패키지의 partial 함수를 언제 사용하는지를 알아보고,

예제와 함수 동작 원리에 대해서 알아보려고 한다.

 

 

 

 

partial 함수는 언제 사용하는가?

 

파이썬에서 함수(function)는 특정 변수(parameter)를 입력받아 어떤 작업을 수행한다.

 

보통 함수는 변하는 값을 입력받을 때 parameter로 정의하지만, 실제 함수를 사용할 때는 parameter 값을 고정해 사용할 때도 많다.

 

 

이 때 사용하는 것이 partial 함수이다.

 

 

 

partial 함수 튜토리얼

예제를 통해서 partial 함수를 이해해보자.

 

먼저 partial 함수를 import 해준다.

from functools import partial

 

 

 

 

다음으로 3가지 값(a, b, c)를 입력 받으면 이를 모두 곱해주는 간단한 함수(func)가 있다고 하자.

 

여기서 이 함수의 2가지 값을 항상 3과 5로 고정해서 사용하고 있다고 가정하자.

 

 

그러면 함수를 호출할 때마다 3가지 값(3, 5, 변수)을 매번 전달하는 것보다는,

고정된 값을 제외한 새로운 값만 전달하는 것이 더 효율적일 것이다.

 

이 때 사용하는 함수가 partial이라고 할 수 있고, 아래와 같이 코드를 작성할 수 있다.

func = lambda a, b, c: a * b* c

# Create a new function that multiplies by 3 and 5.
partial_func = partial(func, 3, 5) # It delivers values to func parameter in order defined.

# Then, these two functions return same output below.
print(func(3, 5, 6)) # It returns 90 (3 * 5 * 6).
print(partial_func(6)) # It also returns 90 (3 * 5 * 6).

 

partial 함수를 이용해서 func 함수와 동일한 기능을 하는 부분 함수 partial_func를 새로 정의된다고 보면된다.

 

즉, partial 함수를 통해 func함수의 두 변수에 3과 5를 전달하고, 하나의 변수만 입력받으면 되는 partial_func 함수를 정의한 것이다.

 

여기서 partial 함수에 func의 인자를 argument 형식으로 주게되면, 함수에서 정의된 parameter 순서에 따라 인자 값을 전달한다 (a = 3, b = 5로 전달됨).

 

 

 

 

partial_func2 = partial(func, b = 5, a = 3) # It delivers 5 to b parameter, and 3 to a parameter.

print(partial_func2(c = 6)) # It also returns 90 (3 * 5 * 6).

 

partial 함수에 func 인자를 keywords 형식으로도 줄 수 있는데, 이 경우는 각 parameter에 들어갈 value 값을 명시하기 때문에, 복잡한 함수에서는 가독성이 좋을 수 있다.

 

 

 

 

partial_func3 = partial(func, b = 5, a = 3) # It delivers 5 to b parameter, and 3 to a parameter.

print(partial_func3(6)) # It raise TypeError: <lambda>() got multiple values for argument 'a'.
# Because args deliver a=6, and keywords defined in partial also deliver a = 6.

하지만 위와 같이, arguments와 keywords를 동시에 정의한 경우는 유의하여야 하는데,

 

arguments의 순서에 해당하는 parameter가 keywords에서 또 전달되는 경우, 충돌하여 에러가 날 수 있으니 주의해야 한다.

 

위 예시에서는 partial 함수에서 keywords로 a = 3이 전달되었는데, 밑에서 args로 또 a = 6이 전달되어 에러가 발생한다.

 

 

 

 

 

partial 함수 더 깊게 살펴보기

그러면 partial 함수는 어떻게 동작할까?

 

partial 공식 도큐먼트에는 다음 코드와 같이 partial 함수가 동작한다고 한다.

def partial(p_func, /, *p_args, **p_keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = {**p_keywords, **fkeywords}
        return p_func(*p_args, *fargs, **newkeywords)
    newfunc.p_func = p_func
    newfunc.p_args = p_args
    newfunc.p_keywords = p_keywords
    return newfunc

 

개괄적으로 살펴보면, partial 함수 newfunc라는 함수를 내부적으로 정의하고 이 newfunc 함수를 return하는 함수다.

 

먼저 partial 함수가 호출되면 전달 받은 함수(p_func), 매개변수(p_args)와 키워드(p_keywords) 값은

newfunc 함수의 변수로 전달된다.

 

 

 

위 예시처럼 partial 함수를 이용해 partial_func를 선언한 경우,

 

partial 함수를 통해 newfunc p_func, p_args, p_keywords의 값이 먼저 정의된다.

 

이후 정의된 partial_func를 호출하여 fargs fkeywords를 입력하면, 기존 p_args와 p_keywords 값들을 합쳐서 p_func를 실행하는 원리이다.

 

 

 

 

Reference

반응형