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引用
总结:闭包具有延迟加载特性,返回的函数可以引用其外部函数的局部变量和参数。
本文分享自 程序员郭震zhenguo 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!