python27期day13:闭包、装饰器初始、标准版装饰器、作业题

1、闭包: 保护数据安全、保护数据干净性。

2、闭包的定义:在嵌套函数内、使用非全局变量(且不使用本层变量)

        将嵌套函数返回
3、闭包举例子:

def func():
a = 10
def foo():
print(a)
return foo
f = func()
f()
结果:10
4、验证闭包函数:__closure__
def func():
a = 10          #自由变量
def foo():
print(a)      #打印a有一个绑定关系
return foo
f = func()
print(f.__closure__)
结果:(<cell at 0x0000000001E285E8: int object at 0x00000000525A8190>,)
5、函数体执行完以后将函数体开辟的空间都释放掉了
6、模拟买车求平均价版一:
lst = []
def buy_car(price):
lst.append(price)
arg = sum(lst) / len(lst)
print(arg)
buy_car(120000) #周一
buy_car(240000) #周二
buy_car(10000000) #周三
buy_car(5500000) #周四
buy_car(120000) #周五
buy_car(50000000) #周六
buy_car(5000000) #周日
结果:   120000.0

      180000.0
      3453333.3333333335
      3965000.0
      3196000.0
      10996666.666666666
      10140000.0

7、版二:查看闭包函数里面的自由变量__code__.co_freevars:

def buy_car():
lst = []
def func(price):
lst.append(price)
arg = sum(lst) / len(lst)
print(arg)
return func
f = buy_car()
print(f.__code__.co_freevars)
f(1)
f(2)
f(3)
f(4)
f(5)
结果:('lst',)

    1.0
    1.5
    2.0
    2.5
    3.0

8、查看闭包函数里面的局部变量__code__.co_varnames:

def buy_car():
lst = []
def func(price):
lst.append(price)
arg = sum(lst) / len(lst)
print(arg)
return func
f = buy_car()
print(f.__code__.co_freevars)
print(f.__code__.co_varnames)
f(1)
f(2)
f(3)
f(4)
f(5)
结果:('lst',)

    ('price', 'arg')
    1.0
    1.5
    2.0
    2.5
    3.0

9、没有将嵌套的函数返回也是一个闭包、但是这个闭包不是一个可使用的闭包:

def func():
a = 10
def foo():
print(a)
print(foo.__closure__)
func()
# 结果:(<cell at 0x00000000021785E8: int object at 0x00000000592F8190>,)
10、

猜你喜欢

转载自www.cnblogs.com/zhang-da/p/11651366.html