zoukankan      html  css  js  c++  java
  • 11.闭包

    第一版: 没有保证数据的安全
    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)>>>
    <function make_average..average at 0x0000002F02CD1268>
    print(avg(100000))
    print(avg(110000))
    print(avg(120000))

    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())
    '''
    2
    3
    4
    5
    '''

    
    判断是否是闭包:
    
    ```python
    例一:
    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)
            age  = 'alex'
    	
        return inner
    a = 2
    b = 3
    ret = wrapper(a, b)
    也是闭包
    

    1561122503349

    判断一个函数是不是闭包 == 闭包函数有没有自由变量

    print(ret.__code__.co_freevars)# ('a', 'b')
    了解
    print(ret.__code__.co_varnames) # 函数中的局部变量
    ('age',)
    
    • 闭包: 多用于面试题: 什么是闭包? 闭包有什么作用。

    ​ 1,闭包只能存在嵌套函数中。

    ​ 2, 内层函数对外层函数非全局变量的引用(使用),就会形成闭包。被引用的非全局变量也称作自由变量,这个自由变量会与内层函数产生一个绑定关系,自由变量不会再内存中消失。闭包的作用:保证数据的安全。

    • 如何判断一个嵌套函数是不是闭包

      1,闭包只能存在嵌套函数中。

      2, 内层函数对外层函数非全局变量的引用(使用),就会形成闭包

    • 闭包的应用:

      1. 保证数据的安全。
      2. 装饰器的本质
  • 相关阅读:
    java操作生成jar包 和写入jar包
    jboss配置jndi连接池
    windows 域的LDAP查询相关举例
    LDAP error Code 及解决方法
    HDU 6417
    CF1299D Around the World
    codechef Chef and The Colored Grid
    Educational Codeforces Round 82 (Rated for Div. 2)
    CF1237F Balanced Domino Placements
    CF1254E Send Tree to Charlie
  • 原文地址:https://www.cnblogs.com/pythonblogs/p/11100125.html
Copyright © 2011-2022 走看看