目录
一,闭包
1,闭包函数含义以及三要素
2,定义一个简单的闭包
二,装饰器
1,装饰器的作用场景以及特点
2,定义一个简单的装饰器
1,需求1
2,需求2
三,装饰器的实例
1.排序并比较排序用时
2.添加身份校验
一,闭包
1,闭包函数含义以及三要素
闭包函数是指在一个函数内部定义的函数,该内部函数可以访问外部函数的变量和参数,并且可以在外部函数执行结束后继续访问和操作这些变量和参数。
1,外层函数嵌套内层函数
2,内层函数可以访问外层函数的局部变量
3,外层函数可以返回内层函数
2,定义一个简单的闭包
def outer_func():x = 10def inner_func():print(x)return inner_funcclosure = outer_func()
closure() # 输出:10
外层函数嵌套内层函数
这里的closure返回的是外层函数执行的结果,也就说内层函数
外层函数返回内层函数
内层函数可以访问外层函数的局部变量 x = 10
closure()执行的就是内层函数inner_func 的函数内容
二,装饰器
1,装饰器的作用场景以及特点
装饰器的作用是在被装饰函数的前后添加一些额外的操作,而无需修改原始函数的定义。这样可以实现代码的复用和功能的组合。常见的应用场景包括日志记录、性能统计、权限验证等。
用于在保持原始代码不变的情况下对其进行功能扩展或修改。
装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。
2,定义一个简单的装饰器
1,需求1
实现一个简单的需求 打印“hello”
def say_hello():print(f'hello')say_hello()
2,需求2
现在要求在原有函数不变的前提下,增加一个功能:实现打印(小米 hello)
def say_hello_xm(f):def xm():f()return xm
这是一个闭包
根据闭包的用法
把say_hello 当作变量赋予say_hello_xm
def say_hello_xm(f):def xm():f()return xmdef say_hello():print(f'hello')say_hello() = say_hello_xm(say_hello)say_hello()
在python中也有一个对于装饰器的表达
在要被装饰的函数前 @装饰器函数名
def say_hello_xm(f):def xm():f()return xm@say_hello_xm
def say_hello():print(f'hello')say_hello()
这就是一个简单的装饰器 在原有函数不变的前提下,对其增加新的功能
三,装饰器的实例
1.排序并比较排序用时
对列表以及他的浅copy列表进行排序
额外需求 : 在不改变函数内容的前提下,比较排序用时
# 有额外形参的 可以规定排序的方式“升序/倒序”
# 引入一个形参 sort_type 默认是False 正序 (=True则是倒序)
datas = [random.randint(0, 10000) for i in range(1000)]
# 随机1000个数
datas_copy = datas.copy()# f 就是要加工的函数
def add_function(f):def function(sort_type):stat = time.time()f(sort_type)print(f'{f.__name__} 用时{time.time() - stat}')return function# 闭包# 把my_fun1的全部赋予了f
# 外部函数又返回内部函数
# 内部函数又调用f()@add_function # python中规定的,这就是把其下函数用 add_function 去装饰
def my_fun1(sort_type):datas.sort(reverse=sort_type)print(datas)@add_function
def my_fun2(sort_type):new_list = sorted(datas_copy, reverse=sort_type)print(new_list)
2.添加身份校验
显示主页面,用户页面,购物车页面
额外需求:在进入用户以及购物车页面前需要进行用户登录
user = None
def login_required(f):def check():global userif user:f()else:while True:user_name = input(f'输入用户名')pwd = input(f'输入密码')if user_name == '小龙' and pwd == '1230':f()user = '小龙'breakelse:print(f'用户名或密码错误')return checkdef home():print(f'我是首页')@login_required
def user_center():print(f'我是用户中心')@login_required
def shopping_cart():print(f'我是购物车')home()user_center()shopping_cart()