跳转至

Python 闭包

本文总阅读量次 ,原创教程,严禁转载

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引用