Python lambda函数计算数字的阶乘

标签 python python-2.7 lambda

我刚开始学习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/

相关文章:

python - 如何使用 update() 方法对 Python Pandas Dataframe 中的 collection.Counter 对象求和?

security - 如何在 Python 2.7 中安全地验证 HMAC?

java - 在 Java 8 中使用 lambda 表达式时出现错误的非法开头

c++ - lambda 函数中的 max_element

python - 如何迭代 ManyToManyField?

python - 高效 append 到 Pandas 数据帧

Python:尝试通过 SSH 执行命令时 Paramiko 挂起

c# - 在表达式树中组合表达式

python - 为什么我可以重新分配 dict.update 但不能重新分配 dict.__setitem__

python - 如何在 python 3 中打印正则表达式匹配结果?