首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我正试着把这个问题想象出来,但我遇到了很多麻烦

我正试着把这个问题想象出来,但我遇到了很多麻烦
EN

Stack Overflow用户
提问于 2022-11-24 15:56:17
回答 1查看 63关注 0票数 2

这两行代码来自一张试卷,我正试图找出如何正确地可视化变量的移动方式。输出为8。

代码语言:javascript
复制
f = lambda x, y: lambda z: (x)(y)(z)
print((f)(lambda x: lambda y: x, lambda z: z * 2)(3)(4))

我试过使用在线python可视化网站,但我仍然无法理解如何处理工作。如果有人善意地将其重写为“def函数()”,是否有可能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-24 17:42:24

f可以编写为如下函数:

代码语言:javascript
复制
def f(x, y):
    def inner(z):
        return x(y)(z)
    return inner

f有两个函数,xyx是一个接受另一个函数(y)的函数,并返回接受参数z的第三个函数。

print语句使用两个名为in的匿名函数调用f

代码语言:javascript
复制
print((f)(lambda x: lambda y: x, lambda z: z * 2)(3)(4))

我们可以重写此打印语句如下:

代码语言:javascript
复制
print((f)(lambda_x, lambda_z)(3)(4))

将lambda_x定义为:

代码语言:javascript
复制
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重写为:

代码语言:javascript
复制
def lambda_x(x):
    return x

所以你可以看到,y只是这里的一种红鲱鱼。

lambda_z可以重写为:

代码语言:javascript
复制
def lambda_z(z):
    return z*2

当我们运行print语句时,使用参数f lambda_xlambda_z调用lambda_z。在运行f时,我们创建一个新函数inner,它用参数lambda_z调用lambda_x。我们已经看到,如果我们调用lambda_x并将某个函数传递给它,我们只需将该函数返回。因此,当我们用lambda_xlambda_z调用lambda_xlambda_z时,我们得到的只是lambda_z

然而,lambda_x的定义需要传递一个多余的参数y --它什么也不做,也没有得到任何值。在这个print语句中,3扮演这个角色。您可以使用任何替代3的方法重新运行原始的两行代码,并获得相同的结果--使用'foo'3+j或任何其他类型的参数来代替打印语句中的3 --这没有什么区别。

因此,f返回函数lambda_z,该函数使用最后的参数4,并根据lambda_z的定义返回8

一击一击:

如果沿途添加print语句,则可以按照结果输出中的各种函数调用进行操作。在这里,我已经设置了print语句,用'foo'代替3来演示它的多余性:

代码语言:javascript
复制
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))

其结果是:

代码语言:javascript
复制
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

希望这能帮你弄清楚?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74563389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档