闭包
外部函数嵌套内部函数,外部函数返回内部函数,内部函数可以访问外部函数的变量
import time
def time_cost(f):
def calc():
statr = time.time()
f()
print(f'函数{f.__name__}消耗{time.time() - statr}')
return calc
import random
data = [random.randint(0, 10000) for i in range(10000)]
data2 = data.copy()
@time_cost
def my():
data.sort()
print(data)
# my = time_cost(my)
my()
@time_cost # 相当于把me()变成实参赋给time_cost 等效于me = time_cost(me)
def me():
new_list = sorted(data2)
print(new_list)
# me = time_cost(me)
me()
通过外包给函数加功能。
装饰器
装饰器(Decorator)是 Python 中一种特殊的函数,主要用来修改其他函数的功能。装饰器本质上是一个高阶函数,它接受一个函数作为输入,并返回一个新的函数作为输出。
在 Python 中,装饰器通常用于在不改变原函数代码的情况下,给函数添加额外的功能或者修改原函数的行为。这种方法使得代码更加简洁和易于维护,也符合 Python 的“开放封闭”原则,即对扩展是开放的,对修改是封闭的。
装饰器广泛应用于日志记录、性能测试、事务处理、缓存、权限校验等场景,它们使得这些功能可以与业务逻辑分离,提高了代码的可读性和可维护性。
总结来说,装饰器是 Python 中一种强大的编程工具,可以动态修改函数或类的功能,同时保持代码简洁和可复用。
装饰器案例
user = None
def my(f):
def me():
global user
if user:
f()
else:
while True:
username = input('请输入用户名')
password = input('请输入密码')
if username == 'a' and password == '1':
user = username
f()
break
else:
print('用户名或密码错误')
return me
def index():
print('我是首页')
index()
def center():
print('我是个人中心')
center = my(center)
center()
# @my
def cart():
print('我是购物车')
cart()
给个人中心和购物车加权限