闭包
- 闭包的定义:闭包是指在一个外部函数中定义了一个内部函数,这个内部函数引用了外部函数的局部变量,并且外部函数返回了这个内部函数。返回的内部函数被称为闭包。
- 闭包的作用:闭包的主要作用是保存外部函数的变量状态,即使外部函数已经执行完毕,这些变量仍然可以被内部函数访问。这使得闭包能够实现函数之间的数据共享和封装。
- 形成条件:闭包的形成需要满足三个条件:有外部函数,外部函数内有内部函数,内部函数使用了外部函数的变量,并且外部函数返回了内部函数。例如:
def outer(msg): message = msg def inner(): print(message) return inner closure = outer("Hello, World!") closure() # 输出 "Hello, World!"
装饰器
- 饰器的定义:装饰器是一种特殊类型的闭包,它用于在不修改原函数代码的情况下,增加函数的功能。装饰器本质上是一个接受函数作为参数并返回新函数的高阶函数。
- 装饰器的作用:通过装饰器,可以对已有函数进行扩展,增加诸如日志记录、性能测试、权限校验等功能。这提高了代码的重用性和模块化。
- 形成条件:装饰器的形成条件包括不修改原函数源代码、不改变原函数调用方式、为原函数增加额外功能。装饰器的参数有且只有一个,并且是函数类型。例如:
def log_decorator(func): def wrapper(*args, **kwargs): print(f"{func.__name__} function is called.") return func(*args, **kwargs) return wrapper @log_decorator def my_function(): print("This is my function.") my_function() # 输出 "my_function function is called." 和 "This is my function."
装饰器案例
-
# import copy # # import random # import time # # # 统计时间开销 # datas = [random.randint(0, 10000) for i in range(10000)] # datas_copy = copy.copy(datas) # # # def time_cost(f): # def calc(): # start = time.time() # f() # print(f"函数{f.__name__}消耗时间{time.time() - start}") # # return calc # # # @time_cost # def my_fun1(): # datas.sort() # print(datas) # # # @time_cost # def my_fun2(): # new_datas = sorted(datas_copy) # print(new_datas) # # # my_fun1() # # my_fun2() # 权限校验 user = None def login_required(f): def check(): global user if user: f() else: while True: username = input('输入账号') password = input('输入密码') if username == 'admin' and password == '123456': user = 'admin' f() break else: print('用户名或密码错误') return check def index(): print('首页') @login_required def center(): print("个人中心") @login_required def cart(): print("购物车") index() center() cart()