회원가입

인수를 지정해 함수 재정의 partial 함수

NULL 2022-05-16

 

functools.partial 함수는 하나 이상의 인수가 이미 채워진 함수의 새 버전을 만들 때 사용하는 함수다.

 

예제 1)

add_mul 함수에 입력 인수의 합과 곱을 choice 의 값에 따라 선택적으로 리턴하는 함수다.

def add_mul(choice, *args):
    if choice == 'add':
        result = 0
        for i in args:
            result = result + i
    elif choice == 'mul':
        result = 1
        for i in args:
            result = result * i
    return result

add_mul 함수를 활용하여 다음과 같이 동작하는 addmul 함수를 작성하라

add(1, 2, 3, 4, 5) # 15 리턴
mul(1, 2, 3, 4, 5) # 120 리턴

 

대부분 사람은 아래와 같은 코드로 작성할 것이다.

def add(*args):
    return add_mul('add', *args)

def mul(*args):
    return add_mul('mul', *args)

 

하지만 functools.partial 를 사용하여 인수를 지정해 함수를 재정의 할 수 있다.

from functools import partial

def add_mul(choice, *args):
    if choice == "add":
        result = 0
        for i in args:
            result = result + i
    elif choice == "mul":
        result = 1
        for i in args:
            result = result * i
    return result

add = partial(add_mul, 'add')
mul = partial(add_mul, 'mul')

print(add(1,2,3,4,5))  # 15 출력
print(mul(1,2,3,4,5))  # 120 출력

 

예제 2)

만약 add 함수는 항상 100을 기준으로 시작되어야 한다고 가정한다면 다음처럼 간단하게 정의할 수 있다.

add = partial(add_mul, 'add', 100)

이와 같이 add 함수를 지정하고 add(1) 을 호출하면 이미 채워진 100 이라는 값에 1이 더해져서 101이 리턴될 것이다.

 

마찬가지로 mul 함수도 다음과 같이 기준값을 1000으로 지정할 수 있다.

mul = partial(add_mul, 'mul', 1000)

이와 같이 mul 함수를 지정하고 mul(2, 3) 을 호출하면 6000이 리턴될 것이다.

 

그리고 partial 로 만든 함수는 다음과 같이 funcargs 속성을 갖는다.

<function add_mul at 0x7f3a483893a0>
('add', 100)

add 가 가리키는 함수(func)는 add_mul 이고 add_mul 함수에 이미 ('add', 100) 이라는 인수(args)가 채워져 있음을 보여준다.

 

참고 링크: https://wikidocs.net/109304

0 0