【发布时间】:2017-02-04 07:45:18
【问题描述】:
是否有更简洁、高效或简单的 Python 方式来执行以下操作?
def product(lst):
p = 1
for i in lst:
p *= i
return p
编辑:
我实际上发现这比使用 operator.mul 快一点:
from operator import mul
# from functools import reduce # python3 compatibility
def with_lambda(lst):
reduce(lambda x, y: x * y, lst)
def without_lambda(lst):
reduce(mul, lst)
def forloop(lst):
r = 1
for x in lst:
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())
给我
('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)
【问题讨论】:
-
这里给出的选项之间存在功能差异,因为对于空列表,
reduce答案会引发TypeError,而for循环答案会返回 1。这是for循环回答(空列表的乘积不超过 1,不超过 17 或“犰狳”)。 -
请尽量避免使用内置函数的名称(例如列表)作为变量名称。
-
旧答案,但我很想编辑,所以它不使用
list作为变量名... -
空列表的乘积是1。en.wikipedia.org/wiki/Empty_product
-
@ScottGriffiths 您是否还会声称空列表的总和不为 0?我强烈不同意您的说法,空列表的乘积是 1。
标签: python