Python lambda函数计算numb的阶乘

2024-05-13 12:41:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始学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)是什么意思?

有人能解释吗?

谢谢


Tags: lambda函数if语法作者解决方案elsenum
2条回答

阶乘本身几乎如你所料。你推断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是阶乘函数本身。它以自身为第一个论证,以评价点为第二个论证。只要你不介意a(a, b - 1)而不是a(b - 1),这可以概括为recursive_lambda

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

这两种方式你都不必用荒谬的方式把兰姆达传递给自己。

让我们把这一层像洋葱一样剥开。

print (lambda b: (Y))(num)

我们正在创建一个匿名函数(关键字lambda表示我们将要键入一系列参数名,然后是冒号,然后是使用这些参数的函数),然后将num传递给它以满足其一个参数。

   (lambda a, b: a(a, b))(X,b)

在lambda的内部,我们定义了另一个lambda。调用这个lambda Y。这个参数有两个参数,a和b。a是用a和b调用的,所以a是一个可调用的,它接受自己和另一个参数

            (lambda a, b: b*a(a, b-1) if b > 0 else 1
            ,
            b)

这些是Y的参数,第一个是lambda函数,称之为X,我们可以看到X是阶乘函数,第二个参数将成为它的数字。

也就是说,如果我们上去看看Y,我们会打电话给:

X(X, b)

那就行了

b*X(X, b-1) if b > 0 else 1

调用自身,形成阶乘的递归部分。

再往外看,我们可以看到b是我们传给最外层lambda的num。

num*X(X, b-1) if num > 0 else 1

这有点让人困惑,因为它是作为一个令人困惑的一行写的:)

很简单:

n=input()

print reduce(lambda x,y:x*y,range(1,n+1))

相关问题 更多 >