Czy istnieje wbudowana funkcja product () w Pythonie? [duplikat]

To pytanie ma już odpowiedź tutaj:

Przeglądałem samouczek i książkę, ale nie mogę znaleźć żadnej wzmianki o wbudowanej funkcji produktu, tj. tego samego typu co sum (), ale nie mogłem znaleźć niczego takiego jak prod().

Is the only way I could znajdź produkt pozycji na liście importując operator mul()?

Author: Bill the Lizard, 2011-10-31

4 answers

Wypowiedź

Tak, zgadza się. Guido odrzucił pomysł na wbudowaną funkcję prod (), ponieważ uważał, że jest ona rzadko potrzebna.

Alternatywa z reduce ()

Jak zasugerowałeś, nie jest trudno zrobić własne za pomocą zmniejszyć() oraz centrala.mul():

def prod(iterable):
    return reduce(operator.mul, iterable, 1)

>>> prod(range(1, 5))
24

W Pythonie 3, zmniejszyć() funkcja została przeniesiona do modułu functools , więc trzeba dodaj:

from functools import reduce

Przypadek szczególny: faktorie

Na marginesie, podstawowym motywującym przypadkiem użycia prod () jest obliczanie faktorii. Mamy już wsparcie dla tego w module matematycznym :

>>> import math

>>> math.factorial(10)
3628800

Alternatywa z logarytmami

Jeśli Twoje dane składają się z pływaków, możesz obliczyć produkt używając sum () {[15] } 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
 81
Author: Raymond Hettinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 17:27:31

Nie ma product w Pythonie, ale można go zdefiniować jako

def product(iterable):
    return reduce(operator.mul, iterable, 1)

Lub, jeśli masz NumPy, użyj numpy.product.

 18
Author: Fred Foo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-30 22:26:26

Ponieważ funkcja reduce () została usunięta w Pythonie 3.0, musisz przyjąć inne podejście.

Możesz użyć functools.reduce(), aby Zmiana się nie powiodła:

product = functools.reduce(operator.mul, iterable, 1)

Lub, jeśli chcesz podążać za duchem zespołu Pythona (który usunął reduce(), ponieważ uważają, że for byłoby bardziej czytelne), zrób to za pomocą pętli:

product = 1
for x in iterable:
    product *= x
 11
Author: Paul Paulsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-05 21:03:36
from numpy import multiply, product
list1 = [2,2,2]
list2 = [2,2,2]
mult = 3
prod_of_lists = multiply(list1,list2)
>>>[4,4,4]
prod_of_list_by_mult = multiply(list1,mult)
>>>[6,6,6]
prod_of_single_array = product(list1)
>>>8

Numpy ma wiele naprawdę fajnych funkcji dla list!

 7
Author: HuntR2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-30 22:27:17