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)
listlà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 Pythonchỉ cho phép sumlà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 đó 0có ý nghĩa cho sumvà 1cho sản phẩm.

reducecâu trả lời đưa ra aTypeError, trong khiforcâu trả lời vòng lặp trả về 1. Đây là một lỗi trongforcâ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').