Python 基于lambda的阶乘函数
我试图在一行lambda代码中实现下面的函数Python 基于lambda的阶乘函数,python,lambda,Python,Lambda,我试图在一行lambda代码中实现下面的函数 def fac(num): num = int(num) if num > 1: return num * fac(num - 1) else: return 1 我已经构造了一个lambda语句,但我一直遇到语法错误: z = lambda z: if (z > 1) z * (z-1) else 1 首先,如果存在同名的局部变量(参数),则不能引用全局名称z 因此,我们将声明
def fac(num):
num = int(num)
if num > 1:
return num * fac(num - 1)
else:
return 1
我已经构造了一个lambda语句,但我一直遇到语法错误:
z = lambda z: if (z > 1) z * (z-1) else 1
首先,如果存在同名的局部变量(参数),则不能引用全局名称
z
因此,我们将声明一个名为func
的lambda语句,并以良好的方式使用三元
运算符
func = lambda z: z * func(z-1) if (z > 1) else 1
输出
> func(5)
120
不要在真正需要
def
语句的地方使用lambda表达式。Lambda表达式生成匿名函数。匿名函数不能有对自身的引用,Python中的递归依赖于有这样的引用(通常以全局或非局部变量的形式)
也就是说,您可以(使用一些奇特的lambda演算)从匿名函数创建递归函数。诀窍在于匿名函数将接受两个参数:一个是“实”参数,另一个是对要“递归”调用的函数的引用 这里没有递归调用;当
n
大于0时,您的匿名函数只需将n
乘以在n-1
上调用的某个函数f
的返回值即可。(我们假设n>0
)您的函数不知道或不关心f
是什么;它只是把它当作一个论点
给我们递归的是一个称为fix
的单一“通用”递归函数。它接受双参数函数并返回一个单参数函数,该函数调用原始函数,其包装器作为第二个参数传递:
def fix(g):
def wrapper(n):
return g(n, wrapper)
return wrapper
fact = fix(lambda n, f: n*f(n-1) if n else 1)
然后
完整的解决方案如下:
factorial = lambda n: 1 if n <= 1 else factorial(n - 1) * n
factorial=lambda n:1如果n不使用这样的lambda表达式。在Python中不能编写匿名递归函数(至少,如果不先编写第二个函数来计算固定点的话),如果要将lambda表达式的结果赋给一个名称,改为使用def
语句。考虑到函数可以在一行中重写为:def fac(num):如果num>1,则返回num*fac(num-1),否则使用lambda表达式1
。最好这样说:“始终使用def语句,而不是将lambda表达式直接绑定到标识符的赋值语句”,这样我就可以像常规语句一样调用lambda函数本身了functions@Yoko,是的,像func(5)
>>> fact(0)
1
>>> fact(3)
6
>>> fact(6)
720
factorial = lambda n: 1 if n <= 1 else factorial(n - 1) * n