如何以最短代码编写数字列表相乘的程序?

1 投票
2 回答
953 浏览
提问于 2025-04-17 14:42

我在做一个简单的计算器时遇到了这个问题。我写了一个简单的程序来计算一串数字的和,代码如下。但是,乘法的程序写起来有点长。

所以,有没有人能告诉我怎么用更简短的代码来计算一串数字的乘积呢?下面是我现在的代码。

def calculate(oper,*nm):
    return oper(nm)

add=lambda x:sum(x)

def mult(lst):
    tmp=1
    for i in lst:
        tmp*=i
    return tmp

calculate(add,2,34,2)

calculate(mult,8,5,7)

2 个回答

0

你可以使用内置的 reduce 函数,它需要一个可调用的对象(比如函数)、一个列表和一个可选的起始元素。这个函数会用一个元组 (elem, result) 来调用你提供的可调用对象,其中 elem 是列表中的第 i 个元素,而 result 是到目前为止的结果。

reduce(lambda item,prod: item * prod, range(1, 5), 1)
Out[2]: 24

所以上面的过程会先用 (1,1) 调用这个函数,然后用 (2,1*1),接着是 (3,2*1),最后是 (4,3*2)

因此,你需要定义 addmult,然后把你的 calculate 替换成内置的 reduce。

add = lambda item,cumul_sum: item + cumul_sum
mult = lambda item,product: item * product 
reduce(add, range(1,5), 0)
Out[5]: 10
reduce(mult, range(1,5), 1)
Out[6]: 24

http://docs.python.org/2.7/library/functions.html?highlight=reduce#reduce

4

其实,你不需要自己定义一个叫 calculate 的东西,因为Python已经有一个现成的功能可以用,它叫 reduce

def calculate(oper, *nm):
    return reduce(oper, nm)

In [6]: import operator

In [7]: calculate(operator.add, 2, 34, 2)
Out[7]: 38

In [8]: calculate(operator.mul, 8, 5, 7)
Out[9]: 280

注意:在Python3中,reduce 被移到了 functools模块里。(感谢@ErikRoper的提醒。)

撰写回答