闭包
书接上回。我们已经知道,在嵌套函数中,内部函数没有的参数会到外部函数的局部作用域里去找。利用这个特性,可以配合函数的闭包去实现一些好的作用。
闭包的概念:如果内部函数在外部函数返回后被调用,此时就形成了闭包。闭包使得内部函数即便在外部函数的执行上下文结束后,依然能访问外部函数的作用域。
场景类比
让我们带入一个场景,闭包的进行类比理解:
- 一群大人
(外层函数)
带着一群小孩(内层函数)
到大人们设立的包间(环境状态)
里吃饭; - 大人们带了烤炉
(外层函数添加变量,环境状态改变)
,小孩带不了(内层函数没有对应变量)
,可以用大人带的烤炉(内层函数能访问外层函数作用域变量)
; - 当大人们吃完后,先走了
(每次执行后局部作用域栈帧销毁)
,但是烤炉还在房间里(环境状态保留)
,小孩可以继续使用烤炉(内层函数可以继续访问和使用当前环境状态)
。 - 如果想要找小孩做食物
(调用内层函数做运行)
,得先通过大人再找小孩(先调用外层函数得到内层函数的引用地址)
,然后再让小孩做(在得到的引用地址后加括号)
。
应用举例
这是一个计算base的exp次方的函数。可以看到,将exp设置为2时,可以作为计算base的平方的函数使用;而将exp设置为3时,则可以作为计算base的立方的函数使用,以此类推。
def power(exp):
def exp_of(base):
return base ** exp
return exp_of
square = power(2)
cube