Có cách nào ngắn gọn hơn, hiệu quả hơn hay đơn giản là pythonic để làm như sau không?
def product(list):
p = 1
for i in list:
p *= i
return p
BIÊN TẬP:
Tôi thực sự thấy rằng điều này nhanh hơn một chút so với sử dụng toán tử.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())
đưa cho tôi
('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)
list
làm tên biến ...
+
loại danh sách đó (tương tự cho sản phẩm / *
). Bây giờ tôi nhận ra rằng Python được gõ động khiến mọi thứ trở nên khó khăn hơn, nhưng đây là một vấn đề được giải quyết trong các ngôn ngữ lành mạnh với các hệ thống kiểu tĩnh như Haskell. Nhưng dù sao Python
chỉ cho phép sum
làm việc trên các con số, vì sum(['a', 'b'])
thậm chí không hoạt động, vì vậy tôi một lần nữa nói rằng điều đó 0
có ý nghĩa cho sum
và 1
cho sản phẩm.
reduce
câu trả lời đưa ra aTypeError
, trong khifor
câu trả lời vòng lặp trả về 1. Đây là một lỗi trongfor
câu trả lời vòng lặp (sản phẩm của danh sách trống không quá 1 so với 17 hoặc 'armadillo').