zoukankan      html  css  js  c++  java
  • 闭包

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

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

     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,装饰器的本质。

  • 相关阅读:
    MytBatis错题分析
    Spring核心概念
    延迟与缓存
    MyBatis的关联查询
    Mabatis注解
    [leetcode]226. Invert Binary Tree翻转二叉树
    [leetcode]633. Sum of Square Numbers平方数之和
    [leetcode]296. Best Meeting Point最佳见面地点
    [leetcode]412. Fizz Buzz报数
    [leetcode]142. Linked List Cycle II找出循环链表的入口
  • 原文地址:https://www.cnblogs.com/ayongxin93/p/11064918.html
Copyright © 2011-2022 走看看