zoukankan      html  css  js  c++  java
  • 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),再通过调用这几个变量,就可以实现分别对 不同的对象 调用内函数了
     
     
     
     
     
  • 相关阅读:
    Making a CocoaPod
    关于Http
    The podfile
    iOS 8个实用小技巧(总有你不知道的和你会用到的)
    关于深拷贝浅拷贝
    适配ios10(iTunes找不到构建版本)
    iOS 10 推送的简单使用
    __block 和 __weak的区别
    Masonry使用注意事项
    iOS数字键盘自定义按键
  • 原文地址:https://www.cnblogs.com/dream-nalizi/p/9504713.html
Copyright © 2011-2022 走看看