一、闭包:
1. 外部函数嵌套内部函数
2. 外部函数返回内部函数
3.内部函数可以访问外部函数局部变量
闭包(Closure)是指在一个函数内部定义的函数,并且内部函数可以访问外部函数的局部变量,即使外部函数已经执行完毕,这种现象称为闭包。在Python中,闭包常常用来实现一些特定功能,例如保护变量、实现装饰器等。
import randomdef fun1():print("fun1")datas = []def fun2():datas.append(random.randint(0, 100))print("fun2", datas)return fun2r = fun1()
r()r1 = fun1()
r1()print(id(r), id(r1))
特点和用途:
-
访问外部变量:闭包可以访问定义它们的外部函数的局部变量,即使外部函数已经返回,闭包仍然保留对这些变量的引用。
-
保护变量:可以通过闭包来保护数据,因为外部函数的局部变量在闭包中不会被销毁或修改,除非内部函数显式地修改它们。
-
实现装饰器:装饰器本质上就是闭包,它能够在不修改原函数代码的情况下,动态地增加功能。
闭包在Python中常用于函数式编程和实现一些高级的编程模式,能够提供更灵活和高效的编程解决方案。
二、装饰器:
目的:不改变函数原有实现给函数添加新功能
概念:一个闭包就是一个函数+在创建这个函数时可以访问的变量
实现:闭包+@语法
装饰器(Decorator)是Python中一种特殊的函数,它可以修改其他函数的行为或功能。装饰器本质上是一个函数,它接收一个函数作为输入,并返回一个新的函数作为输出。装饰器通常用于在不改变原函数代码的情况下,动态地增加功能、修改函数的行为或者执行额外的操作。
装饰器案例:
1.时间开销:
import random
import timedatas = [random.randint(1, 1000) for i in range(1000)]
datas_copy = datas.copy()def time_cost(f):def calc(sort_type):start = time.time()f(sort_type)print(f"{f.__name__} {time.time() - start}")return calc@time_cost
def fun1(sort_type):datas.sort(reverse=sort_type)print(datas)@time_cost
def fun2(sort_type):new_datas = sorted(datas_copy, reverse=sort_type)print(new_datas)# fun1 = time_cost(fun1)
fun1(True)# fun2 = time_cost(fun2)
fun2(True)
权限校验:
user = Nonedef login_required(f):def chair():global userif user:f()else:while True:username = input("用户名")password = input("密码")if username == "admin" and password == "666666":user = "admin"f()breakelse:print("用户名或密码错误")return chairdef index():print("首页")@login_required
def center():print("个人中心")@login_required
def cart():print("购物车")index()# center = login_required(center)
center()# cart = login_required(cart)
cart()
装饰器的特点和用途:
-
修改函数行为:装饰器允许我们在不修改原函数代码的情况下,添加、修改或扩展函数的行为。
-
动态增加功能:可以在函数调用前后执行额外的操作,如输入验证、性能测试、日志记录等。
-
代码复用和简化:装饰器可以避免代码重复,使代码更加简洁和易于维护。
-
装饰器链:可以同时应用多个装饰器,形成装饰器链,每个装饰器可以独立地修改函数的行为。
在实际应用中,装饰器是Python中非常强大和灵活的特性,被广泛用于Web框架、日志系统、权限控制等需要动态修改函数行为的场景。