用Python在一行中编写阶乘函数

时间:2018-08-10 02:04:46

标签: python function lambda python-2.x

我希望通过以不同的方式执行相同的代码来改善编码,这不仅可以帮助我变得更好地进行编码,而且可以理解不同的人的代码及其编码风格。有人可以解释一下我如何能够纠正类似于下面一行内容的阶乘函数吗?也欢迎使用lambda函数。

def factorial(number):
    fact = 1
    for i in range(1, number + 1):
        fact *= i
    return fact

我知道我可以递归地编写此代码,但我选择不这样做。

4 个答案:

答案 0 :(得分:2)

这是我的一站式解决方案,无需导入任何内容。

def factorial(n: int):
    return n * factorial(n - 1) if n > 1 else 1

递归直到输入数字为1,最后返回结果(在n = 0的情况下,从0!= 1开始返回1)。该解决方案还使用三元运算符将if...else插入一行。

请注意,python具有最大的递归,因此factorial(x)其中x> = 999将导致RecursionError

答案 1 :(得分:0)

您可以使用reduce编写阶乘函数。

from operator import mul
# from functools import reduce # Python3 only

def factorial(x):
    return reduce(mul, range(1, x + 1), 1)

factorial(5) # 24

您还可以从math模块导入它,这还会引发负数和非整数的异常。

from math import factorial

答案 2 :(得分:0)

与 YulkyTulky 的回答类似,也可以仅使用布尔逻辑而不使用 if 来编写单行代码。

factorial = lambda x : x and x * factorial(x - 1) or 1

只要 x 不为零,x and x * factorial(x - 1) 部分就会返回一个值,但当 x 为零时,函数返回 1,结束递归。

factorial(4) # 24

答案 3 :(得分:-1)

您可以借助内置函数reduce编写单行lambda函数(尽管如果升级到Python 3,则必须从reduce导入functools 。X)。请注意,最后一个参数将初始值设置为1,以便0!仍然可以工作:

lambda x: reduce(int.__mul__, range(1, x + 1), 1)

这样:

print((lambda x: reduce(int.__mul__, range(1, x + 1), 1))(4))

例如,将输出24