함수형 프로그래밍/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를 알게 되었다. 이제 이를 활용하여 한번 차근 차근 코딩테스트를 풀어보자