drc*_*coa 7 python lambda python-2.7
我刚开始学习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)
Run Code Online (Sandbox Code Playgroud)
我无法理解奇怪的语法.(a,b)是什么意思?
谁能解释一下?
谢谢
阶乘本身几乎就像你期望的那样.你推断它a是...阶乘函数.b是实际参数.
<factorial> = lambda a, b: b*a(a, b-1) if b > 0 else 1
Run Code Online (Sandbox Code Playgroud)
这个位是阶乘的应用:
<factorial-application> = (lambda a, b: a(a, b))(<factorial>, b)
Run Code Online (Sandbox Code Playgroud)
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))
Run Code Online (Sandbox Code Playgroud)
所以我们有外部部分:
(lambda b: <factorial-application>)(num)
Run Code Online (Sandbox Code Playgroud)
如您所见,调用者必须通过的是评估点.
如果你真的想要一个递归的lambda,你可以命名lambda:
fact = lambda x: 1 if x == 0 else x * fact(x-1)
Run Code Online (Sandbox Code Playgroud)
如果没有,您可以使用简单的辅助函数.你会注意到这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
Run Code Online (Sandbox Code Playgroud)
两种方式你都不必诉诸于将lambda传递给自己的荒谬手段.
让我们把这个衬里剥开就像洋葱一样.
print (lambda b: (Y))(num)
Run Code Online (Sandbox Code Playgroud)
我们正在创建一个匿名函数(关键字lambda意味着我们将要键入一系列参数名称,然后是冒号,然后是使用这些参数的函数),然后传递num以满足其一个参数.
(lambda a, b: a(a, b))(X,b)
Run Code Online (Sandbox Code Playgroud)
在lambda中,我们定义了另一个lambda.调用这个lambda Y.这个有两个参数,a和b.a用a和b调用,所以a是一个可调用的,它自己和另一个参数
(lambda a, b: b*a(a, b-1) if b > 0 else 1
,
b)
Run Code Online (Sandbox Code Playgroud)
这些是Y的参数.第一个是lambda函数,称之为X.我们可以看到X是阶乘函数,第二个参数将成为它的数字.
也就是说,如果我们上去看Y,我们可以看到我们会打电话:
X(X, b)
Run Code Online (Sandbox Code Playgroud)
哪个会做
b*X(X, b-1) if b > 0 else 1
Run Code Online (Sandbox Code Playgroud)
并称之为自我,形成阶乘的递归部分.
并且一直向外看,我们可以看到b是我们传入最外面的lambda的num.
num*X(X, b-1) if num > 0 else 1
Run Code Online (Sandbox Code Playgroud)
这有点令人困惑,因为它被写成一个令人困惑的一个班轮:)
小智 6
这很简单:
n=input()
print reduce(lambda x,y:x*y,range(1,n+1))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10477 次 |
| 最近记录: |