`
dacoolbaby
  • 浏览: 1254360 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Python 闭包

阅读更多

所谓闭包,有2中定义。

 

1.子函数可以使用父函数中的变量

2.一个变量引用者未释放的可执行的代码块。

 

对第1点先举例:

 

def line_conf():
    def line(x):
        return 2*x+1
    print(line(5))   # within the scope


line_conf()
print(line(5))       # out of the scope

#NameError: name 'line' is not defined

 

 

第2点举例:

def line_conf():
    def line(x):
        return 2*x+1
    return line       # return a function object

my_line = line_conf()
print(my_line(5))

 

对于闭包用于处理一些非常特殊的问题。

比如说,我的函数返回一个带有变量的方程。在Java,c++这种语言就很难实现了。

尤其是java里面,函数返回的,只能是一个结果,这个结果必须是一个对象或者是一个值。

 

通过闭包,这个问题就很好地解决了。

 

一个函数和它的环境变量合在一起,就构成了一个闭包(closure)。在Python中,所谓的闭包是一个包含有环境变量取值的函数对象。环境变量取值被保存在函数对象的__closure__属性中。比如下面的代码:

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.__closure__)
print(my_line.__closure__[0].cell_contents)

 __closure__里包含了一个元组(tuple)。这个元组中的每个元素是cell类型的对象。我们看到第一个cell包含的就是整数15,也就是我们创建闭包时的环境变量b的取值

 

一个实际中的闭包case:

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

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

 

 

ref:作者:Vamei 出处:http://www.cnblogs.com/vamei 

http://www.cnblogs.com/vamei/archive/2012/12/15/2772451.html

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics