python中lambda的用法,python中lambda表达式属于可调用对象
本文主要介绍Python中闭包和lambda的作用域解析,有很好的参考价值。希望对你有帮助。如有错误或不足之处,请不吝赐教。
目录
python中的python闭包和lambda作用域坑(闭包和lambda)我们先来看个栗子。
Python闭包与lambda的作用域
书写
def fun():
对于范围(3):中的I
产生x : x * i
f0,f1,f2=fun()
打印(f0(1),f1(2),f2(3))
结尾的写作
def fun():
结果=[]
对于范围(3):中的I
def演示(x):
返回x * i
结果.追加(演示)
回送结果
f0,f1,f2=fun()
打印(f0(1),f1(2),f2(3))
以上两种写法的结果是2,4,6。按照原来的想法,结果应该是0,2,6。
问题原因:
问题在于python的变量搜索规则LEGB(local,enclosing,global,bulitin)。在上面的例子中,I在封闭作用域中,而Python的闭包是后期绑定。闭包中使用的变量I的值是在调用内部函数时找到的。
解决办法
将闭包作用域更改为局部作用域。
书写
def fun():
对于范围(3):中的I
产生x,i=i: x * i
f0,f1,f2=fun()
打印(f0(1),f1(2),f2(3))
收尾写作
def fun():
结果=[]
对于范围(3):中的I
定义演示(x,i=i):
返回x * i
结果.追加(演示)
回送结果
f0,f1,f2=fun()
打印(f0(1),f1(2),f2(3))
上面的输出结果是0,2,6
另一种情况:
def fun():
对于范围(3):中的I
产生x : x * i
f0,f1,f2=fun()
打印(f0(1),f1(2),f2(3))
输出还是2,4,6。
问题原因
fun()方法返回的生成器(或迭代器)并不实际执行,而是在每次调用时执行。
遍历后打印时,I变量使用最后调用的值。如果将lambda视为闭包方法,变量I值仍然是闭包作用域(无局部)
python当中的坑(闭包与lambda)
先来看一个栗子
def create():
return[lambda x : I * x for I in range(5)]
for i in create():
印刷(一(二))
结果:
八
八
八
八
八
create函数的返回值是一个列表,列表的每个元素都是一个函数——一个将输入参数x乘以倍数I的函数,预期结果是0,2,4,6,8。但结果是五个八,并不意外。
因为这个陷阱发生的时候经常用到lambda,所以可能会认为是lambda的问题,但是lambda说不愿意背锅。问题的本质在于python中的属性查找规则,LEGB(local,enclosing,global,bulitin)。在上面的例子中,I在封闭作用域中,而Python的闭包是后期绑定的,这意味着在调用内部函数时会查询闭包中使用的变量值。
解决方法也很简单,就是把闭包作用域改成局部作用域。
def create():
return [lambda x,i=i:i*x for i in range(5)]
for i in create():
印刷(一(二))
另一种写法:
def create():
a=[]
对于范围(5):中的I
定义演示(x,i=i):
返回x*i
a .追加(演示)
返回a
for i in create():
印刷(一(二))
以上两种写法是一样的
结果:
0
注射毒品
四
六
八
再来一个问题相似的栗子
代码很简单:(声明:python3问题)
nums=range(2,20)
对于nums:中的I
nums=过滤器(x: x==i或x%i,nums)
打印(列表(数字))
结果:
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
按照同样正常的逻辑,结果应该是:
[2, 3, 5, 7, 11, 13, 17, 19]
问题产生的原因:
在python3中,filter()函数返回一个迭代器,所以并没有真正执行,而是在每次调用时执行(python2中filter()返回的值列表,不存在这种现象)。遍历后执行打印时,现在执行循环中的函数,和前面栗子的问题一样。变量I使用最后一次调用的值,但与上面的栗子不同,上面的栗子使用嵌入作用域的值,而
nums=range(2,20)
对于nums:中的I
nums=filter(lambda x,i=i: x==i或x%i,nums)
打印(列表(数字))
结果:
[2, 3, 5, 7, 11, 13, 17, 19]
以上个人经验,希望给你一个参考,也希望你能支持盛行的IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。