python 学习笔记 十一 装饰器@,加糖
一、复习
# 三元运算符
# 接收结果的变量 = 条件为真的结果 if 条件 else 条件为假的结果
# 接收结果的变量 = “真结果” if 条件 else “假结果”
# 命名空间和作用域
# 三种:内置 全局 局部
# 作用域:全局 局部 globals() locals()
# globals() 在局部声明一个全局的变量
# nonlocal 在局部声明最近的上一层局部中的变量
# 作用域链: 小范围用变量的时候,先从自己的名字空间找
# 找不到就一层一层向外层找,直到找到为止
# 找不到就报错
# 函数的嵌套调用和嵌套定义
# 定义在函数内部的函数不能被外界直接调用
# 内部函数可以使用外部的变量
# 函数名的本质
# 就是一串内存地址
# 可以赋值、可以作为容器类型的元素、函数的参数和返回值 -->第一类对象
# 闭包:内部函数使用外数函数的变量
def outer():
a = 1
def inner():
print(a)
return inner
i = outer()
i()
二、装饰器
# 装饰器形成的过程:最简单的装饰器 有返回值的 有一个参数 万能参数
# 装饰器的作用
# 不想修改函数的调用方式,但是还想在原来的函数前后添加功能
# 原则:开放封闭原则
# 语法糖:@
# 装饰器的固定模式
import time
# # print(time.time()) #获取当前时间
# # time.sleep(10)
#
# def timmer(f): #装饰器函数
# def inner():
# start = time.time()
# ret = f() #被装饰的函数
# end = time.time()
# print(end - start)
# return ret
# return inner
#
# @timmer #语法糖 @装饰器函数
# def func(): #被装饰的函数
# time.sleep(0.01)
# print('老板好同事好大家好')
# return '新年好'
#
# # func = timmer(func) #有语法糖就不用这句了
# ret = func() #inner
# print(ret)
# 装饰器的作用--->不想修改函数的调用方式,但是还想在原来的函数前后添加功能
# timmer就是一个装饰器,只是对一个函数 有一些装饰作用
# 原则:开放封闭原则
# 开放:对扩展是开放的
# 封闭:对修改是封闭的
'''
# 装饰器带参数函数的装饰器
def timmer(f): #装饰器函数
def inner(*args,**kwargs):
start = time.time()
ret = f(*args,**kwargs) #被装饰的函数
end = time.time()
print(end - start)
return ret
return inner
@timmer #语法糖 @装饰器函数名
def func(a,b): #被装饰的函数
time.sleep(0.01)
print('老板好同事好大家好',a,b)
return '新年好'
@timmer #语法糖 @装饰器函数名
def func1(a):
time.sleep(0.01)
print('老板好同事好大家好', a, b)
return '新年好'
# func = timmer(func)
# ret = func(1,2)
ret = func(1,b=2)
print(ret)
'''
""""
# 装饰器的固定格式
def wrapper(f): #装饰器函数,f是被装饰的函数名字
def inner(*args,**kwargs): #定义内部一个函数
'''在被装饰函数之前要做的事'''
ret = f(*args,**kwargs) #被装饰的函数
'''在被装饰函数之后要做的事'''
return ret
return inner #返回函数的名字,不要加()
@wrapper #语法糖 @装饰器函数名
def func(a,b):
time.sleep(0.01)
print('老板好同事好大家好',a,b)
return '新年发'
ret = func() #执行wrapper里的inner函数并返回func函数里的返回值
print(ret)
"""