Existe-t-il une manière plus concise, efficace ou simplement pythonique de faire ce qui suit?
def product(list):
p = 1
for i in list:
p *= i
return p
ÉDITER:
Je trouve en fait que c'est légèrement plus rapide que d'utiliser operator.mul:
from operator import mul
# from functools import reduce # python3 compatibility
def with_lambda(list):
reduce(lambda x, y: x * y, list)
def without_lambda(list):
reduce(mul, list)
def forloop(list):
r = 1
for x in list:
r *= x
return r
import timeit
a = range(50)
b = range(1,50)#no zero
t = timeit.Timer("with_lambda(a)", "from __main__ import with_lambda,a")
print("with lambda:", t.timeit())
t = timeit.Timer("without_lambda(a)", "from __main__ import without_lambda,a")
print("without lambda:", t.timeit())
t = timeit.Timer("forloop(a)", "from __main__ import forloop,a")
print("for loop:", t.timeit())
t = timeit.Timer("with_lambda(b)", "from __main__ import with_lambda,b")
print("with lambda (no 0):", t.timeit())
t = timeit.Timer("without_lambda(b)", "from __main__ import without_lambda,b")
print("without lambda (no 0):", t.timeit())
t = timeit.Timer("forloop(b)", "from __main__ import forloop,b")
print("for loop (no 0):", t.timeit())
Donne moi
('with lambda:', 17.755449056625366)
('without lambda:', 8.2084708213806152)
('for loop:', 7.4836349487304688)
('with lambda (no 0):', 22.570688009262085)
('without lambda (no 0):', 12.472226858139038)
('for loop (no 0):', 11.04065990447998)
listcomme nom de variable ...
+ce type de liste (de même pour le produit / *). Maintenant, je me rends compte que Python est typé dynamiquement, ce qui rend les choses plus difficiles, mais c'est un problème résolu dans des langages sains avec des systèmes de types statiques comme Haskell. Mais Pythonne permet sumde travailler que sur les chiffres de toute façon, car sum(['a', 'b'])cela ne fonctionne même pas, alors je répète que c'est 0logique pour sumet 1pour le produit.

reduceréponses lèvent aTypeError, alors que laforréponse en boucle renvoie 1. Il s'agit d'un bogue dans laforréponse en boucle (le produit d'une liste vide n'est pas plus 1 que 17 ou 'tatou').