python函数知识七 闭包、装饰器一(入门),,21.闭包闭包:在嵌
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函数知识七 闭包、装饰器一(入门)
评论关闭