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. 装饰器的本质
  • 相关阅读:
    Vue+Element-UI+jQuery+Layer+Camera+Easing的简单应用
    Vue(vue-cli脚手架)中使用layer.js做非模态弹窗(二)
    unicable
    grep 搜索目录时,怎样排除某些目录?
    Mali Midgard架构解析
    如何从GFP确定最后申请的内存来自哪个zone?
    内存申请 GFP_KERNEL GFP_ATOMIC
    Linux内核中的page migration和compaction机制简介
    IOVA/IOMMU
    memory zone spanned/present/managed区别
  • 原文地址:https://www.cnblogs.com/pythonblogs/p/11100125.html
Copyright © 2011-2022 走看看