嗨,我正在尝试编写一个函数来查找任何给定数字的阶乘积。例如对于阶乘(6),我将得到6 * 5 * 3 * 2 * 1的乘积。
因此对于阶乘(3),输出将为6。
我到目前为止的功能是:
import functools
def mult(x, y):
return x * y
def factorial(n):
if n == 0:
return 1
else:
functools.reduce(mult(n,factorial(n - 1)))
但我一直得到一个错误,Python期望2个参数和1给出。我知道我必须以某种方式使用range
,但我无法弄明白。如何编辑现有代码以使其正常运行?
你可以很容易地做到这一点:
>>> import functools, operator
>>> functools.reduce(operator.mul, xrange(1, 6))
120
请注意,第一个参数是一个函数(您传递函数调用的结果)。第二个参数是可迭代的。另请注意,以这种方式编写,不需要递归...
operator.mul
相当于你的mult
功能
如果你正在使用qazxsw poi,那么我会推荐qazxsw poi。如果你正在使用2.7
,那么我们看到looking here at the documentation for reduce
也就是说,我们看到我们需要以与3
相同的方式调用functools.reduce is the same as 2.7
's reduce
。以下是对此的表示:
functools
,转换为:
2.7
对于您的示例,您正在制作自己的运算符,这使 reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
感到困惑。这可以通过添加 functools.reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
,然后使用reduce
中定义的声明方法(即import operator
)来解决。
我希望这有助于清理事情!
operator
当然,如果您愿意,可以使用自己的多功能而不是lambda。
来自functools import reduce
f = lambda x,y:x * y
def factorial(number):if(number == 1):return 1 else:return reduce(f,range(1,number + 1))
打印(阶乘(n))的
operator.add