코딩 연습

(파이썬) functools 모듈의 reduce 함수 본문

Python

(파이썬) functools 모듈의 reduce 함수

코딩아저씨 2017. 3. 23. 00:51
반응형

functools 모듈의 reduce 함수는 다음과 같다. 

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        value = next(it)
    else:
        value = initializer
    for element in it:
        value = function(value, element)
    return value

reduce 함수는 매개 변수로 function, iterable[, initializer] 를 갖는다. function 과 iterable 은 반드시 전달되어야 하고, initializer 는 선택적이라고 보면 된다. 위 코드를 보면 알겠지만 reduce 함수는 다음과 같이 iterable 의 요소들을 function 에 대입하여 결국 하나의 결과값을 리턴해 주는 함수이다. 만약 function 에는 $\rm func$ 가 iterable 에는 $[a_1, \; a_2, \; a_3, \; a_4]$ 가 전달되었다고 하면 reduce 함수는 다음의 결과를 리턴한다. $${\rm func}({\rm func}({\rm func} (a_1, \; a_2), \; a_3), \; a_4) $$

다음 예제를 보면 쉽게 이해할 수 있을 것이다. 

>>> def sum(x, y):
...     return x+y
...
>>> reduce(sum, [1, 2, 3, 4, 5])
15

위 예제에서는 function 으로는 두 개의 수 x, y 를 매개변수로 받아서 두 수의 합을 리턴하는 함수 sum 이, iterable 에는 리스트 [1, 2, 3, 4, 5] 가 전달되었다. 결국 reduce 함수는 다음의 15라는 하나의 값을 리턴하게 된다. $${\rm sum}({\rm sum}({\rm sum}({\rm sum}(1, \;2), \; 3), \; 4), \; 5)=((((1+2)+3)+4)+5)=15$$ 함수 sum 을 다음과 같이 lambda 를 이용하여 표현할 수도 있다.

>>> reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
15

그렇다면 initializer 의 역할은 무엇인가? initializer 는 말 그대로 초기값을 의미한다. 다음의 예제처럼 초기값을 10으로 주면 어떻게 될까?

>>> reduce(lambda x, y: x+y, [1, 2, 3, 4, 5], 10)
25

결과가 25가 되는 것을 볼 수 있다.  reduce 함수 코드에서 봤던 value 의 값에 10이 저장된 상태로 시작하기 때문에 다음의 결과가 리턴되는 것이다. $$(((((10+1)+ 2)+ 3)+4)+5)=25$$   이제 reduce 함수를 이용한 예제를 보자. reduce 함수를 이용하면 factorial 의 계산도 쉽게 할 수 있다.

>>> reduce(lambda x, y: x*y, range(1, 6))
120

따라서 $n!$ 계산을 하고 싶다면 다음과 같이 함수 factorial 을 만들면 된다.

>>> def factorial(n):
...     return reduce(lambda x, y: x*y, range(1, n+1))
...
>>> factorial(6)
720

reduce 함수를 이용하여 다음과 같이 최댓값을 구하는 것도 가능하다.

>>> func = lambda a, b: a if (a > b) else b
>>> reduce(func, [34, 76, 29, 96, 68])
96
이렇듯 reduce 함수는 다양하게 응용이 가능하다.


반응형


Comments