前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python|闭包

Python|闭包

作者头像
double
发布2018-04-02 17:05:23
1.1K0
发布2018-04-02 17:05:23
举报
文章被收录于专栏:算法channel算法channel

01

返回函数

函数名是变量名,那么自然可以作为函数的返回值返回。

def lazy_sum(mylist): def sum(): return reduce(lambda x, y: x + y, mylist) return sum

如上所示,lazy_sum函数返回一个函数,其名字叫做sum,它如何使用呢?

mysum = lazy_sum([1,3,5,7]) print(mysum) #<function lazy_sum.<locals>.sum at 0x7f42c4166c80>

lazy_sum的返回函数赋值给mysum,当我们打印mysum时发现,并没有真正运行内部包裹的函数sum,而是返回一个sum的地址值,因此这是一种延迟加载。

so,调用 mysum()

结果:

16

这才真正运行了内部函数sum

一般的函数,比如:

def sum2(): return reduce(lambda x, y: x + y, mylist)

我们直接调用 rslt = sum2([1,3,5,7]),直接拿到结果了。

注意,lazy_sum(mylist)的参数为mylist,而位于它内部的函数sum()是没有参数的,但是sum()函数在内部却可以引用外部函数的参数 mylist,这说明什么?

02

闭包

当函数lazy_sum返回了一个函数sum后,外部函数lazy_sum的变量还被内部函数或返回的新函数sum引用,这被称为闭包。

一般地,函数内部的临时变量或参数只能被它自己所用,不可能被其他函数引用。

但是,闭包时,返回的内部函数却可以引用其外部的函数中的临时变量和参数。

03

闭包例子

""" lazy sum """ def lazy_sum2(mylist): tmp=10 def sum(): return reduce(lambda x, y: x + y, mylist) return sum,tmp sumfun,tmp = lazy_sum2([1,3,5,7]) print(sumfun()) #16 print(tmp) #10

可以看到lazy_sum2函数内的tmp临时变量可以被内部函数sum引用

总结:闭包具有延迟加载特性,返回的函数可以引用其外部函数的局部变量和参数。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档