工厂函数:一个能够记住嵌套作用域的变量值的函数,尽管那个作用域已经不存在了。
>>> def maker(N):
def action(X):
return X**N
return action
这定义了一个外部函数,这个函数简单地生成并且返回了一个嵌套的函数,却并不调用这个内嵌函数。如果调用外部函数就得到一个生成的内嵌函数的一个引用。这个内嵌函数是通过运行内嵌def而创建的。如果再调用外部得到的那个函数:
>>> f = maker(2)
>>> f(3) # 3的平方
9
>>> f(4) # 4的平方
16
>>>
它将调用内嵌函数,也就是说,maker函数内部的名为action的函数。这一部分最不平凡的就是,内嵌的函数记住了2,即maker含函数内部的变量N的值,尽管在调用执行f时maker已经返回了值并且退出。实际上,在本地作用域的N被作为执行的状态信息保留了下来,我们返回其参数的平方运算。
如果再调用外层函数,将得到一个新的有不同状态信息的嵌套函数,得到了一个参数的三次方而不是平方,但是最初的仍像往常一样是平方。
>>> g = maker(3)
>>> g(3) # 3的3次方
27
>>> f(3) # 3的2次方
9
>>>
这能奏效,是因为像这样对一个工厂函数的每次调用,都得到了自己的状态信息集合。