• 闭包


    闭包的特性:不同版本代码的比较

    第一版: 没有保证数据的安全

     l1 = []  #全局变量
     def make_average(price):
         l1.append(price)
         total = sum(l1)
         return total/len(l1)
     print(make_average(100000))
     print(make_average(110000))
     print(make_average(120000))
     '''
     有很多代码....
     '''
     l1.append(666)
     print(make_average(90000))
    

    第二版:
    每次执行l1是空的。

    def make_average(price):
         l1 = []
         l1.append(price)
         total = sum(l1)
         return total/len(l1)
     print(make_average(100000))
     print(make_average(110000))
     print(make_average(120000))
    

    为了保证数据的安全,闭包

    def make_average():

    l1 = []
    def average(price):
        l1.append(price)
        total = sum(l1)
        return total/len(l1)
    return average
    avg = make_average()
    
    print(avg)
    
    print(avg(100000))
    print(avg(110000))
    print(avg(120000))
    
    print(globals())
    

    修改自由变量:

    def make_average():

     count = 1
     def average():
         nonlocal count
         count += 1
         return count
     return average
     avg = make_average()
    
     print(avg)
     print(avg())
     print(avg())
     print(avg())
     print(avg())
    

    举例判断是否是闭包:

    例一:
    def wrapper():
    a = 1 #自由变量
    def inner():
    print(a)
    return inner
    ret = wrapper()

    例二:

    a = 2
    def wrapper():
    def inner():
    print(a) #没有自由变量
    return inner
    ret = wrapper()

    例三:

    def wrapper(a,b):
    '''

    :param a: 2
    :param b: 3
    :return:
    '''
    name = 'alex'
    def inner():
        print(a)
        print(b)
        name = 'alex'
    
    return inner
    

    a = 2
    b = 3
    ret = wrapper(a, b)
    业哥 不是
    其他人 都说是

    判断一个函数是不是闭包 == 闭包函数有没有自由变量
    print(ret.code.co_freevars) #判断方法

    了解
    print(ret.code.co_varnames) # 函数中的局部变量
    闭包的应用:
    1,保证数据的安全。
    2,装饰器的本质。

  • 相关阅读:
    个人网站
    物理读,逻辑读,预读
    正则表达式
    面向对象五大基本原则
    工作总结
    sql性能优化
    sqlServer游标的使用
    ASP.NET安全[开发ASP.NET MVC应用程序时值得注意的安全问题](转)
    一个简单问题引发对IEnumerable和IQueryable的思考
    EFCodeFirst 各种命令整理
  • 原文地址:https://www.cnblogs.com/ayongxin93/p/11064918.html
Copyright © 2020-2023  润新知