Pronouncement
Yes, that's right. Guido rejected the idea for a built-in prod() function because he thought it was rarely needed.
Python 3.8 Update
In Python 3.8, prod() was added to the math module:
Copy>>> from math import prod
>>> prod(range(1, 11))
3628800
Alternative with reduce()
As you suggested, it is not hard to make your own using reduce() and operator.mul():
Copydef prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
In Python 3, the reduce() function was moved to the functools module, so you would need to add:
Copyfrom functools import reduce
Specific case: Factorials
As a side note, the primary motivating use case for prod() is to compute factorials. We already have support for that in the math module:
Copy>>> import math
>>> math.factorial(10)
3628800
Alternative with logarithms
If your data consists of floats, you can compute a product using sum() with exponents and logarithms:
Copy>>> 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
Answer from Raymond Hettinger on Stack OverflowVideos
Pronouncement
Yes, that's right. Guido rejected the idea for a built-in prod() function because he thought it was rarely needed.
Python 3.8 Update
In Python 3.8, prod() was added to the math module:
Copy>>> from math import prod
>>> prod(range(1, 11))
3628800
Alternative with reduce()
As you suggested, it is not hard to make your own using reduce() and operator.mul():
Copydef prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
In Python 3, the reduce() function was moved to the functools module, so you would need to add:
Copyfrom functools import reduce
Specific case: Factorials
As a side note, the primary motivating use case for prod() is to compute factorials. We already have support for that in the math module:
Copy>>> import math
>>> math.factorial(10)
3628800
Alternative with logarithms
If your data consists of floats, you can compute a product using sum() with exponents and logarithms:
Copy>>> 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
There is no product in Python, but you can define it as
Copydef product(iterable):
return reduce(operator.mul, iterable, 1)
Or, if you have NumPy, use numpy.product.
Historically, Guido vetoed the idea: http://bugs.python.org/issue1093
As noted in that issue, you can make your own:
Copyfrom functools import reduce # Valid in Python 2.6+, required in Python 3
import operator
reduce(operator.mul, (3, 4, 5), 1)
In Python 3.8, the prod function was added to the math module. See: math.prod().
Older info: Python 3.7 and prior
The function you're looking for would be called prod() or product() but Python doesn't have that function. So, you need to write your own (which is easy).
Pronouncement on prod()
Yes, that's right. Guido rejected the idea for a built-in prod() function because he thought it was rarely needed.
Alternative with reduce()
As you suggested, it is not hard to make your own using reduce() and operator.mul():
Copyfrom functools import reduce # Required in Python 3
import operator
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
Note, in Python 3, the reduce() function was moved to the functools module.
Specific case: Factorials
As a side note, the primary motivating use case for prod() is to compute factorials. We already have support for that in the math module:
Copy>>> import math
>>> math.factorial(10)
3628800
Alternative with logarithms
If your data consists of floats, you can compute a product using sum() with exponents and logarithms:
Copy>>> 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
Note, the use of log() requires that all the inputs are positive.