一.闭包
闭包的描述
- 在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。
闭包的构成条件
- 在函数嵌套(函数里面再定义函数)的前提下
- 内部函数使用了外部函数的变量(还包括外部函数的参数)
- 外部函数返回了内部函数
闭包的实例
- 利用闭包实现对固定数值的加法
# 定义一个外部函数 def func_out(num1): # 定义一个内部函数 def func_inner(num2): # 内部函数使用了外部函数的变量(num1) result = num1 + num2 print("结果是:", result) # 外部函数返回了内部函数,这里返回的内部函数就是闭包 return func_inner # 创建闭包实例 f = func_out(1) # 执行闭包 f(2) # 结果是: 3 f(3) # 结果是: 4
- 利用闭包实现方程的计算
# 定义外部函数 def a_line(a, b): # 定义内部函数 def arg_y(x): # 函数返回值 return a*x+b # 返回函数 return arg_y lin1 = a_line(3, 5) print(lin1(10)) # 35
二.装饰器
装饰器的描述
- 给已有函数增加额外功能的函数,它本质上就是一个闭包函数。
- 不修改已有函数的源代码
- 不修改已有函数的调用方式
- 给已有函数增加额外的功能
装饰器实例
-
利用装饰器实现程序运行时间的计算
import time def timmer(func): def wrapper(): start_time = time.time() func() stop_time = time.time() print(f"运行时间是{stop_time-start_time}") # # 运行时间是3.0026679039001465 return wrapper @timmer def i_can_sleep(): time.sleep(3) i_can_sleep()
-
带有参数的装饰器
def new_tips(argv): def tips(func): def nei(a, b): print(f"start{argv}", end=' ') func(a, b) print("stop") return nei return tips @new_tips("add") def add(a, b): print(a+b, end=' ') @new_tips("sub") def sub(a, b): print(a-b, end=' ') add(3, 5) # startadd 8 stop sub(3, 5) # startsub -2 stop
-
装饰器的嵌套使用
import time
def time_print(f):
def inner(a, b):
start = time.time()
time.sleep(3)
f(a, b)
end = time.time()
print(f"程序运行了{end-start}秒")
return inner
def start_end(f):
def inner(a, b):
print("程序开始执行")
f(a, b)
print("程序结束执行")
return inner
@start_end
@time_print
def add_func(a, b):
print(a+b)
add_func(3, 5)
'''
程序开始执行
8
程序运行了3.0135695934295654秒
程序结束执行
'''