一、闭包:
1. 外部函数嵌套内部函数
2. 外部函数返回内部函数
3.内部函数可以访问外部函数局部变量
闭包(Closure)是指在一个函数内部定义的函数,并且内部函数可以访问外部函数的局部变量,即使外部函数已经执行完毕,这种现象称为闭包。在Python中,闭包常常用来实现一些特定功能,例如保护变量、实现装饰器等。
import random
def fun1():
print("fun1")
datas = []
def fun2():
datas.append(random.randint(0, 100))
print("fun2", datas)
return fun2
r = fun1()
r()
r1 = fun1()
r1()
print(id(r), id(r1))
特点和用途:
-
访问外部变量:闭包可以访问定义它们的外部函数的局部变量,即使外部函数已经返回,闭包仍然保留对这些变量的引用。
-
保护变量:可以通过闭包来保护数据,因为外部函数的局部变量在闭包中不会被销毁或修改,除非内部函数显式地修改它们。
-
实现装饰器:装饰器本质上就是闭包,它能够在不修改原函数代码的情况下,动态地增加功能。
闭包在Python中常用于函数式编程和实现一些高级的编程模式,能够提供更灵活和高效的编程解决方案。
二、装饰器:
目的:不改变函数原有实现给函数添加新功能
概念:一个闭包就是一个函数+在创建这个函数时可以访问的变量
实现:闭包+@语法
装饰器(Decorator)是Python中一种特殊的函数,它可以修改其他函数的行为或功能。装饰器本质上是一个函数,它接收一个函数作为输入,并返回一个新的函数作为输出。装饰器通常用于在不改变原函数代码的情况下,动态地增加功能、修改函数的行为或者执行额外的操作。
装饰器案例:
1.时间开销:
import random
import time
datas = [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 = None
def login_required(f):
def chair():
global user
if user:
f()
else:
while True:
username = input("用户名")
password = input("密码")
if username == "admin" and password == "666666":
user = "admin"
f()
break
else:
print("用户名或密码错误")
return chair
def 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框架、日志系统、权限控制等需要动态修改函数行为的场景。
标签:闭包,函数,python,def,print,装饰,datas From: https://blog.csdn.net/2401_86120676/article/details/140646158