함수형 프로그래밍/python

reduce, 원하는 함수로 배열 혹은 값을 누적처리하여 결과값을 구해보자

thebirghtwide 2021. 7. 17. 00:32

reduce 어찌보면 좀 생소한 개념일 것이다. 일단 예를 들어서 한번 파악해보자 

from functools import reduce  

def add(x ,y) :
    print ( "x : ", x, " y : ", y)
    return x + y 

reduce(add, [0, 1, 2, 3, 4])

일단 위는 reduce의 예제이다. reduce에는 두 가지 혹은 세 가지의 매개변수가 들어간다. 일단 처음 변수는 함수이다. 위를 보면 add 함수를 사용한 것을 볼 수 있는데 이 함수는 배열의 요소값을 순차적으로 돌며 계산하고 싶은 함수를 뜻한다. 다음은 배열이다. 배열은 계산하고 싶은 값들의 모음이다. 결과를 보면 

x :  0  y :  1
x :  1  y :  2
x :  3  y :  3
x :  6  y :  4
10

좀 더 직관적으로 이해 할 수 있다. 각 요소값들이 차례대로 더해지는 것이다. reduce를 쓰면 n! 과 같은 연산도 쉽게 구현 할 수 있다. 

from functools import reduce  

def multi(x ,y) :
    print ( "x : ", x, " y : ", y)
    return x * y 

reduce(multi, [ 1, 2, 3, 4])

'''
x :  1  y :  2
x :  2  y :  3
x :  6  y :  4
24
'''

 

더보기

| reduce 직접 구현 

이제 reduce 함수를 직접 구현해 보자 구현 코드는 아래와 같다. 

def reduce(f , iterable, acc = None) :
    _iter = iter(iterable) 
    if ( acc == None)  :
        acc = next(_iter)
    for _i in _iter :
        acc = f( acc , _i)
    return acc

위 함수를 보면 3개의 매개변수를 받는 것을 알 수 있다. 만약 acc가 없다면 iterable 천천히 돌면서 함수를 누적 계산하여 결과를 출력 해준다는 것을 알 수 있다. 아래는 예제 결과 이다. 

def reduce(f , iterable, acc = None) :
    _iter = iter(iterable) 
    if ( acc == None)  :
        acc = next(_iter)
    for _i in _iter :
        acc = f( acc , _i)
    return acc 

def add(x ,y) :
    print ( "x : ", x, " y : ", y)
    return x + y 

reduce(add, [0, 1, 2, 3, 4])
        
'''
x :  0  y :  1
x :  1  y :  2
x :  3  y :  3
x :  6  y :  4
10
'''

이러써 함수형 프로그래밍의 꽃인 reduce와 curry를 알게 되었다. 이제 이를 활용하여 한번 차근 차근 코딩테스트를 풀어보자