2013-01-03 2 views
13

일반적으로 반복 연산을 제공된 반복문에 적용하는 Python 3.3에서 itertools.accumulate()은 함수 인수를 매개 변수로 사용할 수 있습니다. 즉, 이제는 functools.reduce()과 중첩됩니다. 합산에itertools.accumulate() 대 functools.reduce() 대

  1. accumulate() 기본값을하지만 reduce() 어떤 방법으로 기본 있지만하지 않는 동안 당신이 명시 적으로 여분의 초기 조건을 제공하지 않습니다 피상적 인 모습으로, 지금은 둘 사이의 주요 차이점은 될 것 같다 만약 1/0 소자 시퀀스와 함께 사용하기위한 초기 상태를 공급하고 reduce()가 제 기능을 취하면서 2)
  2. accumulate()은 반복 가능한 제 취하게

둘 간의 다른 차이가 있습니까? 또는 처음에는 별개의 용도가 시간이 지남에 수렴하기 시작한 두 가지 기능의 동작에 불과합니까?

+1

accumulate는 https://en.wikipedia.org/wiki/Prefix_sum 스캔을 수행하는 반면 fold는 축소를 수행합니다. https://en.wikipedia.org/wiki/Fold_(higher-order_function) –

답변

17

accumulate은 이전 결과를 유지하는 반면 reduce (다른 언어에서는 폴드라고도 함)이 반드시 필요한 것은 아닙니다.

일반 배는 (단지 재미를 위해,이 작업을 수행하지 않음) 또한 6

을 반환하는 반면 list(accumulate([1,2,3], operator.plus)) 당신은 당신이 문서에서 볼 수 reduce

def accumulate(xs, f): 
    return reduce(lambda a, x: a + [f(a[-1], x)], xs[1:], [xs[0]]) 
+2

'연산자 .add'. 또한, 마지막 스 니펫이 정말 도움이되는지 모르겠다. 1) itertools.accumulate가 iterable을 반환하는 동안 목록을 반환하고, 2) 매우 비효율적이다. – tokland

6

의 측면에서 accumulate를 정의 할 수 있습니다 [1,3,6]을 반환 무엇 차이점은. reduce단일 결과, 시퀀스의 합계, 곱하기 등을 반환합니다. accumulate이상의 모든 반복자를 반환합니다. 중간 결과는입니다. 기본적으로 accumulatereduce 작업의 각 단계 결과에 대해 반복자를 반환합니다.

2

itertools.accumulatereduce과 비슷하지만 값 대신 발전기 *를 반환합니다. 이 발전기는 모든 중간 단계 값을 줄 수 있습니다. 그래서 기본적으로 줄이면 누적되는 것의 마지막 요소가 주어집니다.

* 생성자는 반복기와 유사하지만 한 번만 반복 할 수 있습니다.