为了账号安全,请及时绑定邮箱和手机立即绑定

关于Python里面lambda用法的一个疑惑

关于Python里面lambda用法的一个疑惑

ABOUTYOU 2019-04-08 11:18:38
标题描述可能不是很准确,因为我不知道问题的原因在哪里在《Python学习手册第三版》第16章,作用域和参数这里,有一个例子,反复想了很久,不得其解,希望大家帮我解惑。下面是书中的内容:嵌套作用域和lambda尽管对于def本身来说,嵌套作用域很少使用,但是当开始编写lambda表达式时,就要注意了。我们到17章才会深入学习lambda,但是简短地说,它就是一个表达式,将会生成后面会被调用的一个新的函数,与def语句很相似。由于它是一个表达式,尽管能够使用在def中不能使用的地方,例如,在一个列表或是字典常量之中。就像def,lambda表达式引入了新的本地作用域。多亏了嵌套作用域查找层,lambda能够看到所有生存在所编写的函数的变量。因此,以下的代码现在能够运行,但仅仅是因为如令能够使用嵌套作用域法则了。>>>deffunc():x=4action=(lambdan:x**n)returnaction>>>x=func()>>>printx(2)16我的疑惑是,为什么需要先把x赋值给func(),如果不赋值,直接调用func()会显示:最后,printx(2),为什么这里可以传参数,并且传进的参数,变成了函数例子中lambda表达式里的n?不知道我这样表达是否清楚。谢谢大家。
查看完整描述

2 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

首先更正你的一个概念:
为什么需要先把x赋值给func()正确的说法是把func()的返回值赋值给x。
然后再来看看这段代码的实际含义:
deffunc():#定义函数func()
x=4#函数内部变量x
action=(lambdan:x**n)#定义匿名函数action(n)
returnaction#返回函数action函数对象本身,而不是它的值
x=func()#func()的返回值赋值给x,此时的x是一个函数对象
printx(2)#调用action(2)
其实还可以等价写成下面这个样子:
defouter_func():
x=4
definner_func(n):
returnx**n
returninner_func
x=outer_func()
printx(2)
如有疑问,欢迎讨论。
                            
查看完整回答
反对 回复 2019-04-08
?
BIG阳

TA贡献1859条经验 获得超6个赞

不赋值也行啊,func()(2),action就是一个接受一个参数的匿名函数对象嘛。既然是一个函数对象,那就要用()才能调用它,然后这个函数对象接受一个参数,那就给个参数它咯:)。
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 303 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信