一. local()与globals()
a=0 #全局变量 def func(): a=1 #局部变量 b=2 #局部变量 print(locals()) #打印所有局部变量 print(globals()) #打印所有全局变量 print(a+b) func()
查看一个函数的函数名:
def func(): print('今天五一') print(func.__name__) #func 打印一个函数的函数名
二 . 闭包
一个内层函数中,引用了外层函数(非全局)的变量,这个内层函数就可以成为闭包。
在Python中,我们可以使用__closure__来检测函数是否是闭包。
def a(): a=1 def b(): print(a) print(b.__closure__) return b() a() #1 #(<cell at 0x00000244561C95B8: int object at 0x000000005DB16C10>,)
三.装饰器
def create_prople(): print('女娲造人') def a(f): def b(): f() print('后羿射日') return b create_people=a(create_prople) create_people()
语法糖:(不带返回值)
def a(f): #装饰函数 def b(): f() print('后羿射日') return b @a #装饰器语法糖( 相当于 #create_ people=a(create_people) ) def create_prople(): #被装饰函数 print('女娲造人') create_prople()
装饰器返回带返回值的函数
def a(f): def b(): print('后羿射日') r=f() return r return b @a #create_ people=a(create_people) def create_prople(): return('女娲造人') ret=create_prople() print(ret)
装饰器返回带参数的函数
def a(f): def b(*args,**kwargs): #*args 任意多个参数 **kwargs 任意多个关键字参数 print('后羿射日') r=f(*args,**kwargs) return r return b @a def create_prople(x,y): return('女娲造人',x,y) @a def func(x): return('大帅逼',x) ret=create_prople(1,2) print(ret) rep=func(3) print(rep)
在一个有装饰器的函数中如何查看函数的函数名?
def a(f): def b(*args,**kwargs): #*args 任意多个参数 **kwargs 任意多个关键字参数 print('后羿射日') r=f(*args,**kwargs) return r return b @a #create_prople=a(create_prople) def create_prople(x,y): return('女娲造人',x,y) print(create_prople.__name__) # b (本应该输出create_people)
from functools import wraps #导入wraps函数 def a(f): @wraps(f) #引用wraps def b(*args,**kwargs): #*args 任意多个参数 **kwargs 任意多个关键字参数 print('后羿射日') r=f(*args,**kwargs) return r return b @a #create_prople=a(create_prople) def create_prople(x,y): return('女娲造人',x,y) print(create_prople.__name__) # 输出create_people
装饰器传参数
# 装饰器带参数 FALL=True def count(c): def a(f): def b(*args,**kwargs): #*args 任意多个参数 **kwargs 任意多个关键字参数 if c: print('后羿射日') r=f(*args,**kwargs) return r else: r = f(*args, **kwargs) return r return b return a #create_people=count(FALL) @count(FALL) # 相当于把@与count(FALL)分开,先执行count(FALL) 在执行@ def create_prople(x,y): return('女娲造人',x,y) @count(FALL) def zuiri(): return ('夸父追日')
多个装饰器修饰一个函数(函数先执行离它最近的装饰器)
#先执行@a2 在执行@a1
def a1(f): def b(): print('aaaa') f() print('1111') return b def a2(f): def b1(): print('bbbb') f() print('2222') return b1 @a1 @a2 def f(): print('大帅逼 ') f() #bbbb #aaaa #大帅逼 #1111 #2222