[Python] Partial Application

야란·2021년 7월 19일
0

Partial Application

partial application은 함수에 요구되는 인자의 일부만 평가한 함수 객체를 생성하기 위하여 사용하는 프로그래밍 기법이다. 파이썬에서는 functools.partial 을 이용해서 사용하게 된다.

partial 함수

함수를 만들어 넘길때 자주사용 (첫번째 인자로 받은 함수의 인자들을 나머지 인자들로 바꾼 후 새 함수를 돌려줌)

def print_characters(char, repeat):
    print(char * repeat)
    
print_characters('*', 10)



import functools

print_characters_20_times = functools.partial(print_characters, repeat=20)

print_characters_20_times('*')
----------------------------------------------

from functools import partial
def add(a, b):
    """Add a to b"""
    return a + b
add_one = partial(add, 1)
add_one(12)


>>> 13

lambda보다 더 많이 쓰임

lambda 와의 차이점?
lambda는 연산이 모두 끝난 후에 코드가 생성(마지막으로 덮어씌워진 값으로 기억된 값이 불러나와지기 때문)
lambda arguments: expression

partial은 이와 달리 생성과 동시에 코드가 생성되어 값이 기억

##### def 이용 #####
def add(a,b):
    return a+b

def base5(n):
    return add(5,n)
print(base5(3))
# add함수의 일부 인자를 base5함수의 선언과함께 기억한다. 따라서 base5는 클로저이다.


##### lambda 이용 #####
def add(a,b):
    return a+b
base5 = lambda n: add(5,n) # add 함수의 일부 인자를 생성과함께 기억한다. 따라서 base5는 클로저이다.

print(base5)
print(base5(3))



##### partial 이용 #####
from functools import partial
base5 = partial(add, 5)



##### partial을 만들어보자 #####
def make_closure(function, *args):
    def closure(*args_):
        return function(*args,*args_)
    return closure
# *args가 먼저 입력해서 기억시키는 값이고
# *args_는 나중에 클로저를 실행할때 입력될 값이다.

base5 = make_closure(add,5) #base5는 고차함수 make_closure가 생성한 클로저이다.

print(base5(3))

Decorator와 partial의 차이점은?
decorator를 만들땐 함수만을 인자로 받지만 partial을 만들땐 함수외에도 함수에 기억시킬 값을 함께 인자로 받는다는 것

profile
🤦🏻‍♀️ 아차차

0개의 댓글