Aşağıdakileri yapmanın daha kısa, etkili veya basit bir yolu var mı?
def product(list):
p = 1
for i in list:
p *= i
return p
DÜZENLE:
Aslında bu işleç kullanmaktan biraz daha hızlı olduğunu buluyorum.
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())
bana verir
('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)
listdeğişken bir isim olarak kullanmaz bu yüzden düzenlemek için cazip ...
+o liste türünün (aynı şekilde ürün / için *) kimlik öğesi olduğunu söyleyebilirim . Şimdi Python'un dinamik olarak yazıldığını fark ediyorum, bu da işleri zorlaştırıyor, ancak bu, Haskell gibi statik tip sistemlere sahip aklı dillerinde çözülmüş bir problem. Ama Pythonsadece sumrakamlar üzerinde çalışmaya izin veriyor , çünkü sum(['a', 'b'])çalışmıyor bile, bu yüzden yine bunun ürün 0için sumve 1ürün için mantıklı olduğunu söylüyorum .

reducecevaplar bir aTypeErroryükselir, oysafordöngü yanıtı 1 geri döner. Bu,fordöngü yanıtındaki bir hatadır (boş bir listenin ürünü 17'den fazla değildir). veya "armadillo").