d: произведение элементов без цикла и без ловушки пустого списка
Нужно перемножить числа в списке: факториал по частям, произведение простых, масштаб коэффициентов. Ручной цикл с acc = 1 легко забыть инициализировать — особенно когда список может быть пустым.
С Python 3.8 есть prod в модуле math. Он берёт iterable и перемножает элементы. Пустой iterable даёт 1 — это математически верный «пустой продукт», как sum([]) даёт 0.
from math import prod
print(prod([2, 3, 5, 7]))
# 210
print(prod(range(1, 6)))
# 120, то есть 5!
print(prod([]))
# 1
print(prod([2, 3], start=10))
# 60
Аргумент start — начальное значение (по умолчанию 1). Удобно, когда произведение уже начато с константы.
В нашем запуске на Python 3.13 prod([0.5] * 20) вернул около 9,5e-7: много маленьких float быстро уходит к нулю. Для таких случаев считают сумму логарифмов, а не «голое» произведение.
Когда брать: целые и умеренные float, олимпиадные произведения по модулю — сначала prod, потом остаток % M (или сразу умножай с модулем в цикле, если числа огромные). Когда не брать: нужен «бегущий» префикс произведений — тогда accumulate из itertools с mul из operator; и не путай с sum.
источник:
#шпаргалка