您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

谈谈Python中的闭包 <源码交易>

  • 时间:2022-07-21 01:15 编辑: 来源: 阅读:293
  • 扫一扫,手机访问
摘要:谈谈Python中的闭包 <源码交易>
闭包很难理解,所以让我们从例子开始。 假设我们需要计算平均值。这些值将从外层传入,然后存储在内部。 (1)class Averager():def _ _ init _ _(self):self . series =[]def _ _ call _ _(self,new _ value):self . series . append(new _ value)total = sum(self . series)return total/len(self . series)avg = Averager()logging . info(' avg(10)-& gt;%s ',avg(10))logging . info(' avg(20)-& gt;%s ',avg(20))logging . info(' avg(30)-& gt;%s ',avg(30))运行结果:非闭包方法定义了一个名为Averager的类。 然后,在初始化方法中为这个类定义一个数组序列,用于保存传入的值。 然后,使用__call__使类实例对象像调用普通函数一样以“object name()”的形式使用。 它接收一个参数作为要计算的新值,内部值保存在series数组中。 (2)实现这种平均计算方法的闭包法可以通过函数式编程来实现。 def make _ averager():series =[]def averager(new _ value):series . append(new _ value)total = sum(series)return total/len(series)return averager avg = make _ averager()logging . info(' avg(10)-& gt;%s ',avg(10))logging . info(' avg(20)-& gt;%s ',avg(20))logging . info(' avg(30)-& gt;%s ',avg(30))与上面的示例相同。 我们定义了一个make_averager函数,里面定义了一个名为averager(new_value)的函数,就是计算平均值的算法。传入的参数保存在外层的系列数组中;最后,返回这个内部函数。 黄色区域表示产生关闭现象的代码段。 series数组是自由变量(free variable),不受内部函数averager的影响,所以可以保存传入的变量的所有值。 调用函数后,内部函数平均器的局部范围内的变量将变得无效。 通过__code__属性可以看到avg函数中的变量名。 __code__属性是编译后的函数定义体。 logging.info('avg。__代码_ _。co _ varnames-& gt;%s ',平均。__代码_ _。co_varnames)logging.info('avg。__代码_ _。co _ freevars-& gt;%s ',平均。__代码_ _。co_freevars)结果:其中co_varnames代表一个局部变量;Co_freevars表示自由变量。 这与我们之前描述的关闭场景一致。 闭包中自由变量的值保存在avg函数的__closure__属性中。 它是一个cell对象列表,每个cell对象与co_freevars列表中的名字一一对应:INFO-avg。__闭包_ _--> _ _-->;(& lt0x000002A8AF736D38处的单元格:0x000002A8AF9C7DC8 >处的列表对象。,)信息-平均值。__closure__[0]。单元格内容-& gt;[10,20,30]运行结果:闭包翻译成闭包。 通过闭包,我们可以保持已定义的自由变量的值。 在这个函数被调用后,我们仍然可以使用这些变量。 Python __call__()方法(详细版)。卢西亚诺·拉马尔霍(作者),道安,吴珂(译者)。流畅的Python [M]。人民邮电出版社,2017:312-315。


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【域名/主机/服务器|】qq邮箱提醒在哪里打开(2024-06-04 18:58)
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部