11.闭包

Posted pythonblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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))

  1. 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
    ‘‘‘
    ```

判断是否是闭包:

例一:
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)
也是闭包

技术图片

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

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

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

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

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

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

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

  • 闭包的应用:

    1. 保证数据的安全。
    2. 装饰器的本质

以上是关于11.闭包的主要内容,如果未能解决你的问题,请参考以下文章

JS高级---闭包小案例

python11 装饰器与闭包

11函数进阶---闭包

python 基础篇 11 函数进阶----装饰器

2019-07-11 闭包函数和装饰器

11.闭包