파이썬의 sum()
함수는 반복 가능한 숫자의 합을 반환합니다.
sum([3,4,5]) == 3 + 4 + 5 == 12
대신 제품을 반환하는 함수를 찾고 있습니다.
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
그러한 기능이 존재한다고 확신하지만 찾을 수 없습니다.
파이썬의 sum()
함수는 반복 가능한 숫자의 합을 반환합니다.
sum([3,4,5]) == 3 + 4 + 5 == 12
대신 제품을 반환하는 함수를 찾고 있습니다.
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
그러한 기능이 존재한다고 확신하지만 찾을 수 없습니다.
답변:
Python 3.8에서는 prod 함수가 수학 모듈 에 추가되었습니다 . math.prod ()를 참조하십시오 .
찾고있는 함수는 prod () 또는 product () 이지만 Python에는 해당 함수가 없습니다. 따라서 직접 작성해야합니다 (쉽습니다).
네 맞습니다. Guido 는 거의 필요하지 않다고 생각했기 때문에 내장 prod () 함수에 대한 아이디어 를 거부했습니다 .
제안한 것처럼 reduce () 및 operator.mul ()을 사용하여 직접 만드는 것은 어렵지 않습니다 .
from functools import reduce # Required in Python 3
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
파이썬 3에서는 reduce () 함수가 functools 모듈 로 옮겨졌습니다 .
참고로, prod () 의 주요 동기 사용 사례 는 계승을 계산하는 것입니다. 우리는 이미 math 모듈 에서이를 지원 합니다 .
>>> import math
>>> math.factorial(10)
3628800
데이터가 부동 소수점으로 구성된 경우 지수와 로그가있는 sum () 을 사용하여 곱을 계산할 수 있습니다 .
>>> from math import log, exp
>>> data = [1.2, 1.5, 2.5, 0.9, 14.2, 3.8]
>>> exp(sum(map(log, data)))
218.53799999999993
>>> 1.2 * 1.5 * 2.5 * 0.9 * 14.2 * 3.8
218.53799999999998
주의 사용 로그는 () 모든 입력 양성해야합니다.
실제로 Guido는이 아이디어를 거부했습니다. http://bugs.python.org/issue1093
그러나이 문제에서 언급했듯이 하나를 쉽게 만들 수 있습니다.
from functools import reduce # Valid in Python 2.6+, required in Python 3
import operator
reduce(operator.mul, (3, 4, 5), 1)
reduce
아닌가요?
product()
표준 라이브러리 에 포함하기 위해 탄원하고 싶다면 이 질문에 대한 견해가 사건을 해결하는 데 도움이 될 수 있습니다.
내장 된 것이 없지만 입증 된 것처럼 자신의 것을 굴리는 것은 간단합니다. 여기에 .
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
이 질문에 대한 답변을보십시오 :
functools.reduce
하는 경우 대신을 사용하십시오 reduce
.
prod = functools.partial(functools.reduce, operator.mul)
prod()
원하는 것을 하는 숫자가 있습니다.
np.prod(range(1,13))
12와 동일한 정답을 제공합니다! 그러나 np.prod(range(1,14))
그렇지 않습니다.
np.prod(arange(1,14, dtype='object'))
?
math.prod()
기능이 답이되지 않는 것.
Numeric.product
(또는
reduce(lambda x,y:x*y,[3,4,5])
)
이것을 사용하십시오
def prod(iterable):
p = 1
for n in iterable:
p *= n
return p
내장 prod
기능 이 없기 때문에 .
lambda a,b: a*b
하면 문제가되지 않습니다. 그러나 감소는 잘 일반화되지 않으며 남용됩니다. 나는 초보자가 그것을 배우지 않는 것을 선호합니다.
functools.reduce () 사용하여 위 의 대답 a 와 b를 선호하고 numpy.prod () 사용 하여 대답 을 선호 하지만 itertools.accumulate () 사용하는 또 다른 솔루션이 있습니다 .
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]