Gibt es eine präzisere, effizientere oder einfach pythonischere Möglichkeit, Folgendes zu tun?
def product(list):
p = 1
for i in list:
p *= i
return p
BEARBEITEN:
Ich finde tatsächlich, dass dies geringfügig schneller ist als die Verwendung von 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())
gibt mir
('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)
listals Variablenname verwendet wird ...
+für diesen Listentyp ist (ebenfalls für product / *). Jetzt ist mir klar, dass Python dynamisch typisiert ist, was die Sache schwieriger macht, aber dies ist ein gelöstes Problem in vernünftigen Sprachen mit statischen Typsystemen wie Haskell. Aber Pythonerlaubt sumsowieso nur , an Zahlen zu arbeiten, da sum(['a', 'b'])es nicht einmal funktioniert, also sage ich noch einmal, dass 0das für sumund 1für das Produkt Sinn macht .

reduceAntworten a auslösenTypeError, während dieforSchleifenantwort 1 zurückgibt. Dies ist ein Fehler in derforSchleifenantwort (das Produkt einer leeren Liste ist nicht mehr 1 als 17 oder "Gürteltier").