python函数知识七 闭包、装饰器一(入门)
程序员文章站
2024-01-05 15:47:58
21.闭包 1. 闭包:在嵌套函数内,使用非全局变量(且不使用本层变量) 2. 闭包的作用:1.保证数据的安全性(纯洁度)。2.装饰器使用 3. ._\_closure\_\_判断是否是闭包 22.装饰器一(入门) 1.一个装饰器装饰多个函数 开放封闭原则:扩展是开放的(增加新功能),源码是封闭的( ......
21.闭包
- 闭包:在嵌套函数内,使用非全局变量(且不使用本层变量)
- 闭包的作用:1.保证数据的安全性(纯洁度)。2.装饰器使用
- .__closure__判断是否是闭包
def func(): a = 1 def foo(): print(a) return foo ret = func() ret() #例子 def func(): avg_lst = [] def foo(pirce): avg_lst.append(pirce) avg = sum(avg_lst) / len(avg_lst) return avg return foo ret = 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 time start_time = time.time def 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 = foo foo = times foo(s)#不改变调用方式
4.版三:(low版装饰器)
def times(f): def inner(): start_time = time.time() f() print(time.time() - start_time) return inner def 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")