Apakah ada cara yang lebih ringkas, efisien atau hanya pythonic untuk melakukan hal berikut?
def product(list):
p = 1
for i in list:
p *= i
return p
EDIT:
Saya benar-benar menemukan bahwa ini sedikit lebih cepat daripada menggunakan 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())
memberi saya
('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)
listnama variabel ...
+untuk jenis daftar itu (juga untuk produk / *). Sekarang saya menyadari bahwa Python diketik secara dinamis yang membuat segalanya lebih sulit, tetapi ini adalah masalah yang diselesaikan dalam bahasa waras dengan sistem tipe statis seperti Haskell. Tetapi Pythonhanya memungkinkan sumuntuk bekerja pada angka, karena sum(['a', 'b'])bahkan tidak berfungsi, jadi saya kembali mengatakan itu 0masuk akal untuk sumdan 1untuk produk.

reducejawaban menaikkanTypeError, sedangkanforjawaban loop kembali 1. Ini adalah bug dalamforjawaban loop (produk daftar kosong tidak lebih dari 1 daripada 17 atau 'armadillo').