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

用Python在一行中编写阶乘函数,python,function,lambda,python-2.x,Python,Function,Lambda,Python 2.x,我希望通过以不同的方式执行相同的代码来改进我的编码,这不仅可以帮助我更好地编码,而且可以理解不同的人的代码和他们的编码风格。有没有人能解释一下,我是如何对一个阶乘函数进行修正的,这个阶乘函数与下面一行中发布的类似?也欢迎使用lambda函数 def factorial(number): fact = 1 for i in range(1, number + 1): fact *= i return fact 我知道我可以递归编写,但我选择不这样做。您可以

我希望通过以不同的方式执行相同的代码来改进我的编码,这不仅可以帮助我更好地编码,而且可以理解不同的人的代码和他们的编码风格。有没有人能解释一下,我是如何对一个阶乘函数进行修正的,这个阶乘函数与下面一行中发布的类似?也欢迎使用lambda函数

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

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

您可以在内置函数
reduce
的帮助下编写一行lambda函数(尽管如果升级到Python 3.x,您必须从
functools
导入
reduce
)。请注意,最后一个参数将初始值设置为
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

可用于编写阶乘函数

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

这是我的一行解决方案,没有导入任何内容

def factorial(n: int):
    return n * factorial(n - 1) if n > 1 else 1
它递归直到输入数字为1,最后返回结果(在n=0的情况下,它返回1,因为0!=1)。该解决方案还使用三元运算符将
if…else
拟合到一行中


请注意,python有一个最大递归,因此
阶乘(x)
其中x>=999将导致
递归错误

类似于YulkyTulky的答案,也可以只使用布尔逻辑编写一行程序,而不使用
if

factorial = lambda x : x and x * factorial(x - 1) or 1
x和x*阶乘(x-1)
部分返回一个值,只要x不是零,但当x为零时,函数返回1,结束递归

factorial(4) # 24

你能解释一下你写的reduce函数中最后的
1
参数是什么吗?是不是要处理
0
?@Ely
reduce
所做的是将提供的函数累计应用于累积值和列表中的下一个元素。为此,必须提供初始累积值。最后一个参数是初始值。在这种特殊情况下,正是它使
阶乘(0)
返回
1
。谢谢,我以前用过reduce函数,但从来没有用过最后一个参数,谢谢。