수색…


통사론

  • reduce (함수, iterable [, initializer])

매개 변수

매개 변수 세부
기능 iterable을 줄이기 위해 사용되는 함수 (두 개의 인수를 취해야 함). ( 위치 지정 전용 )
반복 가능한 iterable은 줄어들 것입니다. ( 위치 지정 전용 )
이니셜 라이저 감소의 시작 값. ( 선택 , 위치 한정 )

비고

reduce 는 항상 가장 효율적인 함수가 아닐 수도 있습니다. 일부 유형에는 동일한 기능 또는 메소드가 있습니다.

  • addable 요소 (문자열 아님)를 포함하는 시퀀스의 합계에 대한 sum() ) :

    sum([1,2,3])                                 # = 6
    
  • 문자열의 연결을위한 str.join :

    ''.join(['Hello', ',', ' World'])            # = 'Hello, World'
    
  • next 발전기와 함께 reduce 비해 단락 변종 수 reduce :

    # First falsy item:
    next((i for i in [100, [], 20, 0] if not i)) # = []  
    

개요

# No import needed


# No import required...
from functools import reduce # ... but it can be loaded from the functools module


from functools import reduce # mandatory

reduce 의 다음 요소를 반복하는 기능을 적용하여 반복 가능한 감소 iterable 하고, 지금까지의 누적 결과.

def add(s1, s2):
    return s1 + s2

asequence = [1, 2, 3]

reduce(add, asequence)  # equivalent to: add(add(1,2),3)
# Out: 6

이 예제에서는 우리 자신의 add 함수를 정의했다. 그러나 파이썬에는 operator 모듈에 표준 기능이 있습니다.

import operator
reduce(operator.add, asequence)
# Out: 6

reduce 는 또한 시작 값을 전달할 수 있습니다.

reduce(add, asequence, 10)
# Out: 16

reduce 사용

def multiply(s1, s2):
    print('{arg1} * {arg2} = {res}'.format(arg1=s1, 
                                           arg2=s2, 
                                           res=s1*s2))
    return s1 * s2

asequence = [1, 2, 3]

initializer 가 주어지면 함수는 이니셜 라이저와 첫 번째 iterable 요소에 적용하여 시작됩니다.

cumprod = reduce(multiply, asequence, 5)
# Out: 5 * 1 = 5
#      5 * 2 = 10
#      10 * 3 = 30
print(cumprod)
# Out: 30

initializer 매개 변수가 없으면 첫 번째 두 목록 요소에 함수를 적용하여 reduce 가 시작됩니다.

cumprod = reduce(multiply, asequence)
# Out: 1 * 2 = 2
#      2 * 3 = 6
print(cumprod)
# Out: 6

누적 제품

import operator
reduce(operator.mul, [10, 5, -3])
# Out: -150

임의 / 모두의 비 단락 회로

reduceiterable 이 completly iterated되기 전에 반복을 종료하지 않으므로 any() 또는 all() 단락 회로를 생성하는 데 사용할 수 있습니다.

import operator
# non short-circuit "all"
reduce(operator.and_, [False, True, True, True]) # = False

# non short-circuit "any"
reduce(operator.or_, [True, False, False, False]) # = True

시퀀스의 첫 번째 truthy / falsy 요소 (없으면 마지막 요소)

# First falsy element or last element if all are truthy:
reduce(lambda i, j: i and j, [100, [], 20, 10])    # = []
reduce(lambda i, j: i and j, [100, 50, 20, 10])    # = 10

# First truthy element or last element if all falsy:
reduce(lambda i, j: i or j, [100, [], 20, 0])     # = 100
reduce(lambda i, j: i or j, ['', {}, [], None])   # = None

lambda 함수를 만드는 대신 일반적으로 명명 된 함수를 만드는 것이 좋습니다.

def do_or(i, j):
    return i or j

def do_and(i, j):
    return i and j

reduce(do_or, [100, [], 20, 0])                   # = 100
reduce(do_and, [100, [], 20, 0])                  # = []


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow