这两行代码来自一张试卷,我正试图找出如何正确地可视化变量的移动方式。输出为8。
f = lambda x, y: lambda z: (x)(y)(z)
print((f)(lambda x: lambda y: x, lambda z: z * 2)(3)(4))我试过使用在线python可视化网站,但我仍然无法理解如何处理工作。如果有人善意地将其重写为“def函数()”,是否有可能?
发布于 2022-11-24 17:42:24
f可以编写为如下函数:
def f(x, y):
def inner(z):
return x(y)(z)
return innerf有两个函数,x和y。x是一个接受另一个函数(y)的函数,并返回接受参数z的第三个函数。
print语句使用两个名为in的匿名函数调用f:
print((f)(lambda x: lambda y: x, lambda z: z * 2)(3)(4))我们可以重写此打印语句如下:
print((f)(lambda_x, lambda_z)(3)(4))将lambda_x定义为:
def lambda_x(x):
def lambda_y(y):
return x
return lambda_y lambda_x是一个接受某些函数x的函数。然后,它创建一个函数lambda_y,它接受一些参数y。不管y是什么,lambda_y都返回传递给lambda_x - x的原始函数。换句话说,可以将lambda_x重写为:
def lambda_x(x):
return x所以你可以看到,y只是这里的一种红鲱鱼。
lambda_z可以重写为:
def lambda_z(z):
return z*2当我们运行print语句时,使用参数f lambda_x和lambda_z调用lambda_z。在运行f时,我们创建一个新函数inner,它用参数lambda_z调用lambda_x。我们已经看到,如果我们调用lambda_x并将某个函数传递给它,我们只需将该函数返回。因此,当我们用lambda_x和lambda_z调用lambda_x和lambda_z时,我们得到的只是lambda_z。
然而,lambda_x的定义需要传递一个多余的参数y --它什么也不做,也没有得到任何值。在这个print语句中,3扮演这个角色。您可以使用任何替代3的方法重新运行原始的两行代码,并获得相同的结果--使用'foo'、3+j或任何其他类型的参数来代替打印语句中的3 --这没有什么区别。
因此,f返回函数lambda_z,该函数使用最后的参数4,并根据lambda_z的定义返回8。
一击一击:
如果沿途添加print语句,则可以按照结果输出中的各种函数调用进行操作。在这里,我已经设置了print语句,用'foo'代替3来演示它的多余性:
def f(x, y):
print (f'Calling "f", with arguments {x} and {y}')
def inner(z):
print (f'Calling function "inner" with argument {z}')
return x(y)(z)
print (f'returning "inner"')
return inner
def lambda_x(x):
print (f'calling lambda_x with argument {x}')
def lambda_y(y):
print (f'calling lambda_y with argument {y}, returning {x}')
return x
return lambda_y
def lambda_z(z):
print (f'calling lambda_z with argument {z}')
return z*2
print((f)(lambda_x, lambda_z)('foo')(4))其结果是:
Calling "f", with arguments <function lambda_x at 0x0000017EC49109D0> and <function lambda_z at 0x0000017EC4910940>
returning "inner"
Calling function "inner" with argument foo
calling lambda_x with argument <function lambda_z at 0x0000017EC4910940>
calling lambda_y with argument foo, returning <function lambda_z at 0x0000017EC4910940>
calling lambda_z with argument 4
8希望这能帮你弄清楚?
https://stackoverflow.com/questions/74563389
复制相似问题