我刚开始学习python。我遇到了 lambda 函数。在其中一个问题上,作者要求为数字的阶乘编写一个单行 lambda 函数。
这是给出的解决方案:
num = 5
print (lambda b: (lambda a, b: a(a, b))(lambda a, b: b*a(a, b-1) if b > 0 else 1,b))(num)
我无法理解奇怪的语法。 a(a,b) 是什么意思?
谁能解释一下?
谢谢
最佳答案
阶乘本身几乎如您所料。您推断 a
是...阶乘函数。 b
为实际参数。
<factorial> = lambda a, b: b*a(a, b-1) if b > 0 else 1
这一位是阶乘的应用:
<factorial-application> = (lambda a, b: a(a, b))(<factorial>, b)
a
是阶乘函数本身。它以自身作为第一个参数,评估点作为第二个参数。这可以推广到 recursive_lambda
只要你不介意 a(a, b - 1)
而不是 a(b - 1)
:
recursive_lambda = (lambda func: lambda *args: func(func, *args))
print(recursive_lambda(lambda self, x: x * self(self, x - 1) if x > 0 else 1)(6))
# Or, using the function verbatim:
print(recursive_lambda(lambda a, b: b*a(a, b-1) if b > 0 else 1)(6))
所以我们有外部:
(lambda b: <factorial-application>)(num)
如您所见,调用者只需要通过评估点即可。
如果您实际上想要一个递归的 lambda,您可以只用 name the lambda :
fact = lambda x: 1 if x == 0 else x * fact(x-1)
如果没有,你可以使用a simple helper function .您会注意到 ret
是一个可以引用自身的 lambda,这与之前的代码不同,其中没有 lambda 可以引用自身。
def recursive_lambda(func):
def ret(*args):
return func(ret, *args)
return ret
print(recursive_lambda(lambda factorial, x: x * factorial(x - 1) if x > 1 else 1)(6)) # 720
这两种方式你都不必诉诸荒谬的方式将 lambda 传递给它自己。
关于Python lambda函数计算数字的阶乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15401376/