Python闭包
编辑日期: 2024-11-28 文章阅读: 次
Python闭包
返回函数
函数名是变量名,那么自然可以作为函数的返回值返回。
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,这说明什么?
闭包
当函数lazy_sum返回一个函数sum后,外部函数lazy_sum的变量还被内部函数或返回的新函数sum引用,这被称为闭包。
一般地,函数内部的临时变量或参数只能被它自己所用,不可能被其他函数引用。
但是,闭包时,返回的内部函数却可以引用其外部的函数中的临时变量和参数。
闭包例子
> """
> 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
引用