day43 装饰器
学习日期:20241020
学习目标:函数 - 56 装饰器:函数嵌套的定义与调用的区别
学习笔记:
变量作用域
变量读取顺序:local-》enclosed-》global-》builtin
# 变量作用域
# 全局变量
number=100
def foo():number2 = 200 # 本地变量print(f'函数内部{number2}')
# 优先调用本地变量,未找到本地变量会调用全局变量
foo() # 函数内部200
# 函数外部不可调用函数内部变量
print(f'函数外部{number2}') # 提示 name 'number2' is not defined
闭包
# 闭包
def out():number3=120 # 闭包变量def fun_in():return number3return fun_inf=out() # 返回对象 fun_in ,也可以写成out()()
print(f()) # 调用fun_in函数,返回number3的值120
装饰器语法
# 装饰器
import time
print(time.time())from functools import wraps
def time_it(func):@wraps(func)def wrapper():start=time.time()func()stop=time.time()print(f'func 函数一共执行了{int(stop-start)}秒')return wrapper@time_it
def work():print('func函数开始执行')time.sleep(1)print('func函数执行结束')work()
#func函数开始执行
# func函数执行结束
# func 函数一共执行了1秒# 调用@wraps装饰器,不改变内置对象
print(work.__name__)
自带装饰器
总结
- 变量作用域保证同名,但不同作用范围不会出现引用错误
- 装饰器可以使函数功能更明确,更容易实现函数抽象
- 系统内置装饰器可以辅助用户编写更复杂的函数功能
- 闭包作用域之内,内部函数可以访问外部函数的变量