pokemonlei

陈磊的博客 | pokemonlei

python闭包

前言

其实闭包是一个很简单的概念,不只是在python中有,所有把函数做为一等公民的语言均有闭包的概念。不过像Java这样以class为一等公民的语言中也可以使用闭包,只是它得用类或接口来实现。

虽然概念简单,但用处强大,然而这个概念却经常忘记,本着好记性不如烂笔头的想法,在这里大体概括一下闭包的基本概念,加强记忆。

什么是闭包?

维基上的解释是:在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。

简而言之:就是函数里嵌套一个内部函数,内部函数用到了外边函数中的变量,此时内部函数和用到的外部变量组成了一块空间,这块整体空间就叫闭包。而由于在python中,函数是第一类对象可以当作返回值返回,所以这个闭包也可以当作变量传递

上代码:

1
2
3
4
5
6
7
8
def func(myname):
def inner_func(hername):
print(myname, ' and ', hername)
return inner_func

withwho = func('pokemonlei')
withwho('qq') # >>> pokemonlei and qq

闭包有什么用?

  • 返回一个函数然后延迟执行
  • 封装一个私有变量
  • 用来实现python的装饰器等