pydata

Keep Looking, Don't Settle

python closure

如果一个函数里面定义了另一个函数,这样的函数叫nested function, nested function可以访问它的封闭区域内的变量。比如

def add_function(value):
    def add_value(x):
        return x + value
    return add_value

add3 = add_function(3)

print add3(10)  # output is 13

now if we delete the function add_function. we can still run add3 function and 3 will be remembered.

这种数据3和code捆绑在一起的方法叫闭包closure

什么时候会出现closure?

以下三个条件必须满足: 1. 有一个nested function(function inside a function) 2. nested function会涉及一个定义在封闭函数内部的值 3. 最终要返回nested function

什么时候使用closure

closure避免了使用全局变量。如果一个类(class)只有很少的methods的时候,使用closure会更方便简洁。比如上面的例子,我们可以很快的定义不同的加法函数

add5 = add_function(5)
add10 = add_function(10)

print add5(10)
print add10(10)

所有的python函数都有一个__closure__属性。

add_function.__closure__
add5.__closure__        # Out[18]: (<cell at 0x00000000040A09A8: int object at 0x0000000001D58758>,)

add5.__closure__[0].cell_contents

Figure 1. tab1: show the plot

png