python函数知识七 闭包、装饰器一(入门),,21.闭包闭包:在嵌


21.闭包

闭包:在嵌套函数内,使用非全局变量(且不使用本层变量)闭包的作用:1.保证数据的安全性(纯洁度)。2.装饰器使用.__closure__判断是否是闭包
def func():    a = 1     def foo():        print(a)    return fooret = func()ret()#例子def func():    avg_lst = []    def foo(pirce):        avg_lst.append(pirce)        avg = sum(avg_lst) / len(avg_lst)        return avg    return fooret = func()print(ret(1500))print(ret(1600))print(ret.__closure__)#结果:(<cell at 0x000002095400B558: list object at 0x00000209540A5B48>,)证明是闭包print(func.__closure__)#结果:None,不是闭包print(ret.__code__.co_freevars)#获取的是自由变量print(ret.__code__.co_varnames)#获取的是局部变量

22.装饰器一(入门)

1.一个装饰器装饰多个函数

开放封闭原则:扩展是开放的(增加新功能),源码是封闭的(修改已经实现的功能)

作用:在不改变源代码及调用方式的基础下额外增加新功能。

装饰器:用来装饰的工具

2.版一:
import timestart_time = time.timedef func():    time.sleep(2)#睡眠s模拟网络延时    print("我要飞")func()   print(time.time - start_time)#改变了源代码
3.版二:
def times(f):    start_time = time.time()    f()    print(time.time() - start_time)def foo():    time.sleep(3)    print("我飞的比你高")#times(foo)#改变了调用方式s = foofoo = timesfoo(s)#不改变调用方式
4.版三:(low版装饰器)
def times(f):    def inner():        start_time = time.time()        f()        print(time.time() - start_time)    return innerdef foo():    time.sleep(3)    print("我飞的比你高")foo = times(foo)foo()
5.版四:
def wrapper(f):    def inner(a):        start_time = time.time()        f(a)        print(time.time() - start_time)    return inner#切记不加括号def func(a):    print(f"{a}你不行")func = wrapper(func)func("alex")#传输多个数据,用*args,**kwargs
6.版五(标准版装饰器):

@wrapper#语法糖:必须放在要装饰的函数的正上方

def wrapper(f):#f是要被装饰的函数名    def inner(*args,**kwargs):        "被装饰前"        start_time = time.time()        ret = f(*args,**kwargs)        print(time.time() - start_time)        "被装饰后"        return ret    return inner#切记不加括号@wrapper#语法糖 -->func = wrapper(func)def func(*args,**kwargs):    print(f"{a}你不行")    return "我可以返回了"#func = wrapper(func)#有语法糖不用多次赋值func("alex")

python函数知识七 闭包、装饰器一(入门)

评论关闭