python中lambda的用法,python中lambda表达式属于可调用对象

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: