Python 闭包

闭包的编写套路:
def outer(a,b):  
    def inner(x):
        .......
        return ...
return inner
        
 
outer称为外函数
inner称为内函数,内函数inner使用了外函数outer的参数a,b。
外函数outer最终的返回值是内函数inner的引用。
 
闭包是Python实现面向对象的一种方式。
每调用一次外函数outer,就会产生一个对象;
n = outer(4,6)
m = outer(5,3)
n 和 m 就是两个不同的对象。如果这个函数是用来计算二元一次方程的话,那么 n 和 m 就是两条不同的直线。
 
调用不同对象的内函数就可以对不同对象进行操作了。
对 n 对象进行操作:
print(n(9))  # 因为outer()函数的返回值是内函数inner的引用 --> 它被赋给了 n 这个变量,所以直接调用 n 就相当于调用了 outer(4,6) 这个外函数里的 inner() 
假如这个函数是用来求解二元一次方程的,那么 outer(4,6) 就相当于创建了 4X+6 这条直线(对象),而调用 n(9) 就相当于把 X=9 带入这个式子进行计算,得到的结果就是 42 了。
 
每次调用 n(?) 都是调用了 outer(4,6)里的 inner(?) ,inner(?) 使用了 outer(4,6)里的参数 4 和 6 。作为内函数是可以任意使用外函数的变量的。
但是,如果要修改外函数的变量的话,有 2 个方法:
1)在修改之前需要用 nonlocal 关键字声明变量,表示需要向上一层变量空间找这个变量。
2)把 闭包变量 改成 可变类型,比如 列表 。
 
代码实例:
 1 def counter(first = 0):
 2     cnt = [0]
 3     def add_one():
 4         cnt[0]+=1
 5         return cnt[0]
 6     return add_one
 7 
 8 num5 = counter(5)
 9 print(num5())
10 print(num5())
11 print(num5())
12 print(num5())
13 print(num5())

运行结果:

 
是什么将内函数与外函数紧紧联系在一起,是外函数的参数。外函数的参数是实现面向对象的本质。不同的外函数参数创建了不同的对象。
内函数是可以任意使用外函数的参数和变量的,在上面这个例子中,外函数有一个变量 cnt 和一个参数 first,内函数只使用了 变量 cnt ,那么内函数是怎么对外函数参数产生的对象进行操作的呢?在外函数使用不同的参数产生多个对象的时候,内函数是如何识别不同的对象并分别对它们进行操作的呢?
num5 = counter(5)
 
num6 = counter(6)
 
num7 = counter(7)
 
#上面就产生了三个不同的对象了,它们分别是这样调用内函数的:
num5()
 
num6()
 
num7()
 
#因此答案揭晓:通过将 不同对象 赋给 不同的变量(num5,num6,num7),再通过调用这几个变量,就可以实现分别对 不同的对象 调用内函数了
 
 
 
 
 
posted @ 2018-08-20 11:40  钠离子  阅读(156)  评论(0编辑  收藏  举报