Aktualizacja:
W Pythonie 3.8 funkcja prod została dodana do modułu matematycznego . Zobacz: math.prod () .
Starsze informacje: Python 3.7 i wcześniejsze
Funkcja, której szukasz, nazywa się prod () lub product (), ale Python nie ma tej funkcji. Musisz więc napisać własny (co jest łatwe).
Wymowa on prod ()
Tak to prawda. Guido odrzucił pomysł wbudowanej funkcji prod (), ponieważ uważał, że rzadko jest ona potrzebna.
Alternatywnie z redukcją ()
Jak zasugerowałeś, nie jest trudno stworzyć własne za pomocą funkcji replace () i operator.mul () :
from functools import reduce # Required in Python 3
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
Uwaga: w Pythonie 3 funkcja zmniejszania () została przeniesiona do modułu funkools .
Przypadek szczególny: czynniki
Na marginesie, głównym motywującym zastosowaniem dla prod () jest obliczenie silni. Mamy już na to wsparcie w module matematycznym :
>>> import math
>>> math.factorial(10)
3628800
Alternatywa z logarytmami
Jeśli twoje dane składają się z liczb zmiennoprzecinkowych, możesz obliczyć produkt za pomocą sum () z wykładnikami i logarytmami:
>>> 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
Uwaga: użycie log () wymaga, aby wszystkie dane wejściowe były dodatnie.
Właściwie Guido zawetował pomysł: http://bugs.python.org/issue1093
Ale, jak zauważono w tym numerze, możesz łatwo go utworzyć:
źródło
reduce
?product()
do standardowej biblioteki, liczba poglądów na to pytanie może pomóc w uzasadnieniu sprawy.Nie ma żadnego wbudowanego, ale łatwo go wyrzucić, jak pokazano tutaj :
Zobacz odpowiedzi na to pytanie:
Który moduł Python nadaje się do manipulacji danymi na liście?
źródło
functools.reduce
zamiastreduce
.prod = functools.partial(functools.reduce, operator.mul)
Jest
prod()
numpy, która robi to, o co prosisz.źródło
np.prod(range(1,13))
daje poprawną odpowiedź równą 12! alenp.prod(range(1,14))
nie ma.np.prod(arange(1,14, dtype='object'))
?math.prod()
Funkcja będzie to odpowiedź nieaktualne.(lub
)
źródło
Użyj tego
Ponieważ nie ma wbudowanej
prod
funkcji.źródło
lambda a,b: a*b
niego nie stanowi problemu. Ale redukcja nie uogólnia się i jest wykorzystywana. Wolę, żeby początkujący go nie uczyli.Wolę odpowiedzi a i b powyżej za pomocą funkcji funools.reduce () i odpowiedź za pomocą numpy.prod () , ale oto jeszcze jedno rozwiązanie za pomocą itertools.accumulate () :
źródło
Być może nie jest to „wbudowane”, ale uważam, że jest wbudowane. w każdym razie po prostu użyj numpy
źródło