Aktualisieren:
In Python 3.8 wurde die Prod- Funktion zum Mathematikmodul hinzugefügt . Siehe: math.prod () .
Ältere Informationen: Python 3.7 und früher
Die gesuchte Funktion würde prod () oder product () heißen, aber Python hat diese Funktion nicht. Sie müssen also Ihre eigenen schreiben (was einfach ist).
Aussprache auf prod ()
Ja, das ist richtig. Guido lehnte die Idee einer eingebauten Funktion prod () ab, weil er dachte, dass sie selten benötigt würde.
Alternative mit reduzieren ()
Wie Sie vorgeschlagen haben, ist es nicht schwer, mit redu () und operator.mul () eigene zu erstellen :
from functools import reduce # Required in Python 3
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
Beachten Sie, dass in Python 3 die Funktion redu () in das functools-Modul verschoben wurde .
Sonderfall: Fakultäten
Nebenbei bemerkt, der primäre motivierende Anwendungsfall für prod () ist die Berechnung von Fakultäten. Dafür haben wir bereits Unterstützung im Mathematikmodul :
>>> import math
>>> math.factorial(10)
3628800
Alternative mit Logarithmen
Wenn Ihre Daten aus Gleitkommazahlen bestehen, können Sie ein Produkt mit sum () mit Exponenten und Logarithmen berechnen :
>>> 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
Beachten Sie, dass für die Verwendung von log () alle Eingaben positiv sind.
Eigentlich hat Guido gegen die Idee ein Veto eingelegt: http://bugs.python.org/issue1093
Wie in dieser Ausgabe erwähnt, können Sie jedoch ganz einfach eine erstellen:
quelle
reduce
?product()
in die Standardbibliothek stellen möchte , kann die Anzahl der Ansichten zu dieser Frage hilfreich sein.Es ist kein einziger eingebaut, aber es ist einfach, einen eigenen zu rollen, wie hier gezeigt :
Siehe Antworten auf diese Frage:
Welches Python-Modul eignet sich zur Datenmanipulation in einer Liste?
quelle
functools.reduce
anstelle vonreduce
.prod = functools.partial(functools.reduce, operator.mul)
Es gibt eine
prod()
Zahl, die das tut, wonach Sie fragen.quelle
np.prod(range(1,13))
gibt also die richtige Antwort gleich 12! abernp.prod(range(1,14))
nicht.np.prod(arange(1,14, dtype='object'))
?math.prod()
Funktion macht diese Antwort überflüssig.( oder
)
quelle
Benutze das
Da gibt es keine eingebaute
prod
Funktion.quelle
lambda a,b: a*b
kein Problem. Aber reduzieren verallgemeinert sich nicht gut und wird missbraucht. Ich bevorzuge Anfänger, die es nicht lernen.Ich bevorzuge die Antworten a und b oben mit functools.reduce () und die Antwort mit numpy.prod () , aber hier ist noch eine andere Lösung mit itertools.accumulate () :
quelle
Vielleicht kein "eingebautes", aber ich halte es für eingebaut. sowieso nur numpy verwenden
quelle