我刚开始学习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,b)是什么意思?
有人可以解释一下吗?
由于
答案 0 :(得分:6)
阶乘本身几乎和你期望的一样。你推断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传递给自己的荒谬手段。
答案 1 :(得分:6)
让我们将这一个衬里剥开,就像洋葱一样。
print (lambda b: (Y))(num)
我们正在创建一个匿名函数(关键字lambda意味着我们将要键入一系列参数名称,然后是冒号,然后是使用这些参数的函数),然后传递num以满足其一个参数。< / p>
(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*X(X, b-1) if num > 0 else 1
这有点令人困惑,因为它被写成一个令人困惑的一个班轮:)
答案 2 :(得分:5)
就是这么简单:
n=input()
print reduce(lambda x,y:x*y,range(1,n+1))
答案 3 :(得分:2)
这个功能有两个难点
1. lambda a, b: b*a(a, b-1) if b > 0 else 1
。
2.下面的“b”1。
对于1,它只不过是:
def f(a, b):
if b > 0:
b * a(a, b - 1)
else:
1
2,这个b
(lambda b: (lambda a, b: a(a, b))(lambda a, b: b*a(a, b-1) if b > 0 else 1,b))(num)
(this one)
实际上就是这个b:
(lambda b: (lambda a, b: a(a, b))(lambda a, b: b*a(a, b-1) if b > 0 else 1,b))(num)
(this one)
原因是它不在第二和第三个lambda的定义范围内,所以它指的是第一个b。
在我们应用num并剥离外部函数之后:
(lambda a, b: a(a, b)) (lambda a, b: b*a(a, b-1) if b > 0 else 1, num)
它只是将一个函数应用于元组,(lambda a,b:b * a(a,b-1),如果b> 0,则为1,num)
让我们把这个元组称为(f,num)(f的def在上面)
在其上应用lambda a, b: a(a, b)
,我们得到
f(f,num)。
假设你的数字为5 根据f的定义,它首先评估为
5 * f(f, 4)
然后到:
5 * (4 * f(f, 3))
一直到
5 * (4 * (3 * (2 * (1 * f(f, 0)))))
f(f,0)变为1.
5 * (4 * (3 * (2 * (1 * 1))))
我们走了,阶乘5。
答案 4 :(得分:1)
我们可以使用下面的lambda表达式
fact = lambda n:1 if n==0 else n*fact(n-1)
print(fact(5)
>>> 120
答案 5 :(得分:0)
递归lambda的广义def如下所示
recursive_lambda = (lambda func: lambda *args: func(func, *args))
答案 6 :(得分:0)
非常好解释!只有一个小修复:如果b> 1不是b> 0
结果相同但在逻辑上更正确,因为它正在执行一个不必要的额外循环(即使乘以1)
Wikipedia =&gt; n!是所有小于或等于n
的正整数的乘积答案 7 :(得分:0)
如果要使用lambda表达式进行阶乘,则需要放置if条件,例如:
if x==1:
return 1
else
return x*function_name(x-1)
例如fact
是我的lambda表达式:
fact( lambda x:1 if x==1/else x*fact(x-1) )
答案 8 :(得分:0)
使用Lambda函数轻松查找阶乘的方法
fac = lambda x : x * fac(x-1) if x > 0 else 1
print(fac(5))
输出: 120
用户输入以查找阶乘
def fac():
fac_num = int(input("Enter Number to find Factorial "))
factorial = lambda f : f * factorial(f-1) if f > 0 else 1
print(factorial(fac_num))
fac()
输入数字以查找因子:5
120
答案 9 :(得分:0)
相关代码:
lambda b : (lambda a, b : a(a, b)) (lambda a, b : b * a(a, b-1) if b > 0 else 1, b)
为了更加清楚,让我replace variable names a with f, and b with n
。
lambda n : (lambda f, n : f(f, n)) (lambda f, n : n * f(f, n-1) if n > 0 else 1, n)
递归阶乘是一个将调用自身或应用于自身的函数,例如f(f)。
让我们设置Factorial(n) to be f(f,n)
并进行如下计算:
def func(f, n): # takes a function and a number, return a number.
if n > 0 :
return n * f(f, n-1)
else :
return 1
将上述def函数转换为lambda表示法:
func is lambda f, n : n * f(f, n-1) if n > 0 else 1
然后将func与整数n一起应用于自身。
回到开头的语句,Factorial(n) is f(f,n), or f(func,n) when func is applied into f.
def Factorial(n):
# return f (func, n) # next, substitute f and func with their corresponding lambdas.
return (lambda f, n : f(f, n)) (lambda f, n : n * f(f, n-1) if n > 0 else 1, n)
并使用lambda代替def Factorial,整个过程变为:
lambda n : (lambda f, n : f(f, n)) (lambda f, n : n * f(f, n-1) if n > 0 else 1, n)
答案 10 :(得分:-1)
while True:
#It is this simple:
from functools import reduce
n=input('>>')
n=int(n)
if n==0:
print('factorial: ',1)
elif n<0:
print('invalid input')
else:
print('factorial: ',(reduce(lambda x,y:x*y,list(range(1,n+1)))))