1. 闭包
闭包的定义:
- 存在函数嵌套
- 内部函数使用外部函数的变量
- 外部函数返回了内部函数
闭包的作用:内部函数保存外部函数的变量,提高代码的重用性。
示例代码:
# 定义一个外部函数
def out(n1):
# 定义一个内部函数
def inner(n2):
# 内部函数使用了外部函数的变量(n1)
res = n1 + n2
print("结果是:",res)
# 外部函数返回了内部函数,这里返回的内部函数就是闭包
return inner
# 创建闭包实例
f = out(1)
# 执行闭包
f(2)
f(3)
说明:内部函数inner保留了外部函数out的变量:n1,每次执行闭包都是在n1 = 1 基础上进行计算。若修改闭包内使用的外部变量则使用关键字nonlocal
2. 装饰器
装饰器的作用:给已有函数增加额外功能的函数,它本质上就是一个闭包函数。
装饰器的功能特点:
- 不修改已有函数的源代码
- 不修改已有函数的调用方式
- 给已有函数增加额外的功能
通用装饰器的语法格式:
# 通用装饰器
def logging(fn):
def inner(*args, **kwargs):
print("--正在努力计算--")
result = fn(*args, **kwargs)
return result
return inner
实例1 装饰器实现已有函数执行时间的统计
import time
# 装饰器函数
def get_time(func):
def inner():
begin = time.time()
func()
end = time.time()
print("函数执行花费%f" % (end-begin))
return inner
@get_time
def func1():
for i in range(100000):
print(i)
func1()
执行结果:
...
99995
99996
99997
99998
99999
函数执行花费0.329066
实例2 装饰带有参数的函数
# 添加输出日志的功能
def logging(fn):
def inner(num1, num2):
print("--正在努力计算--")
fn(num1, num2)
return inner
# 使用装饰器装饰函数
@logging
def sum_num(a, b):
result = a + b
print(result)
sum_num(1, 2)
运行结果:
--正在努力计算--
3