Python闭包

定义

闭包(closure)即在函数中又有函数的定义,例如:

def fun1(str):
    print("this is fun1 str")
    def fun2(str1):
        print("this is fun2 str and parameter from fun1 %s" %str1)
    fun2(str)

fun1('test')

作用域

作用域与def所在层级相同

作用

可以根据不同的配置信息得到不同的结果

def line_conf():
    b = 15
    def line(x):
        return 2*x+b
    return line       # return a function object

b = 5
my_line = line_conf()
print(my_line(5))
print(my_line(3))

因为函数是一个对象,所以也可以作为函数的返回值。这里line_conf的返回值就可以是line函数。这里可以对my_line赋不同的值,就可以得到不同的结果。看起来也没啥好处,我同样也可以在外面定一个line函数,然后在line_conf中调用就可以了。只是不能返回line函数而已。从功能上看是没啥区别。不同的是,如果是闭包,他是可以直接调用line_conf中的变量的,这称为闭包的环境变量 一个函数和他的环境变量打包在一起就称为闭包(closure)

实例

def line_conf(a, b):
    def line(x):
        return ax + b
    return line

line1 = line_conf(1, 1)
line2 = line_conf(4, 5)
print(line1(5), line2(5))

这里一个函数就定义了一组曲线,该曲线形如$ y = ax + b$。在配置完a , b两个参数后,该函数的形式就确定了下来。后面的line就只需要给一个参数就行了。也就是说,环境变量确定下来了,只需要给函数很少的参数就可以了。如果没有闭包,我们只能用函数完成,这个函数每次都得传递a , b , x的值才能得到y的值。这样增加了程序开销,也不利于程序的移植。

posted @ 2017-04-05 21:05  Weyne  阅读(214)  评论(0编辑  收藏  举报