鱼C论坛

 找回密码
 立即注册
查看: 1453|回复: 3

[已解决]lambda问题

[复制链接]
发表于 2023-11-4 11:59:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
r=[]
for x in range(10):
    r.append(lambda n=x:n**2)
r[0]() //为什么不能直接用r[0]取值呢
最佳答案
2023-11-4 12:00:20
在Python中,lambda关键字用于创建匿名函数,也就是没有名字的函数。在你的代码中,lambda n=x: n**2创建了一个匿名函数,它接受一个参数n并返回n的平方。

r返回的是这个函数本身,而不是函数的结果。在Python中,函数是一种对象,可以像其他对象一样被赋值给变量、作为参数传递给其他函数,或者作为列表、字典等数据结构的元素。因此,r实际上是一个函数对象,而不是一个具体的数值。

如果你想得到函数的结果,你需要调用这个函数。在Python中,调用函数的语法是在函数名后面加上括号(),并在括号中提供参数(如果函数需要参数的话)。因此,r()实际上是在调用r这个函数,并且因为这个函数不需要参数,所以括号中是空的。

所以,r()返回的是r这个函数调用的结果,也就是0的平方,即0。如果你直接使用r,你得到的将是一个函数对象,而不是一个数值。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-4 11:59:51 | 显示全部楼层
在这段代码中,r是一个包含了10个lambda函数的列表。每个lambda函数都有一个参数n,并且返回n的平方。

当我们执行 r[0]() 时,我们期望得到的是0的平方,也就是0。但是实际上,我们得到的结果是81,而不是我们期望的0。

这是因为在循环中,每个lambda函数都引用了变量x。当循环结束后,x的值变为9。因此,每个lambda函数都引用了x的最终值9。

当我们调用 r[0]() 时,lambda函数会使用x的最终值9,而不是我们期望的0。因此,结果是81。

为了解决这个问题,我们可以在lambda函数中使用默认参数来捕获循环变量的当前值。修改代码如下:
r = []
for x in range(10):
    r.append(lambda n=x: n**2)
print(r[0]())  # 输出 0

通过将x的当前值作为默认参数传递给lambda函数,我们可以确保每个lambda函数捕获的是循环变量的当前值,而不是最终值。这样,我们就可以得到正确的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-4 12:00:20 | 显示全部楼层    本楼为最佳答案   
在Python中,lambda关键字用于创建匿名函数,也就是没有名字的函数。在你的代码中,lambda n=x: n**2创建了一个匿名函数,它接受一个参数n并返回n的平方。

r返回的是这个函数本身,而不是函数的结果。在Python中,函数是一种对象,可以像其他对象一样被赋值给变量、作为参数传递给其他函数,或者作为列表、字典等数据结构的元素。因此,r实际上是一个函数对象,而不是一个具体的数值。

如果你想得到函数的结果,你需要调用这个函数。在Python中,调用函数的语法是在函数名后面加上括号(),并在括号中提供参数(如果函数需要参数的话)。因此,r()实际上是在调用r这个函数,并且因为这个函数不需要参数,所以括号中是空的。

所以,r()返回的是r这个函数调用的结果,也就是0的平方,即0。如果你直接使用r,你得到的将是一个函数对象,而不是一个数值。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-4 12:00:38 | 显示全部楼层
在你的代码中,你使用了一个循环来创建一个包含10个lambda函数的列表r。每个lambda函数都返回其创建时x的平方,而不是后续可能修改的x的值。

当你尝试使用r[0]()来调用第一个lambda函数时,它确实返回了0,也就是它创建时的x的平方。但是,如果你尝试使用r[0]来直接获取第一个lambda函数,它会返回一个函数对象,并不会返回0。这是因为r[0]引用的是lambda函数本身,而不是调用该函数所得到的结果。

如果你想要获取第一个lambda函数的返回值,你需要通过调用r[0]()来执行该函数,并将其结果赋值给一个变量或打印输出。例如,以下代码将调用r[0]()并将其结果赋值给变量result
r = []for x in range(10):    r.append(lambda n=x: n**2)result = r[0]()print(result)
输出结果为:

[/code]
0
[/code]

希望这个解释能够帮助你理解问题的原因。如果还有任何疑问,请随时提出。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 13:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表