转载请注明预见才能遇见的博客:http://my.csdn.net/
原文地址:https://blog.csdn.net/pcaxb/article/details/91994655
人工智能系列-Python系列(八)装饰器 = 高阶函数+函数嵌套+闭包
目录
人工智能系列-Python系列(八)装饰器 = 高阶函数+函数嵌套+闭包
1.装饰器初探
# 器即函数
# 装饰即修饰,意指为其他函数添加新功能
# 装饰器定义:本质就是函数,功能是为其他函数添加新功能
# 装饰器:高阶函数+函数嵌套+闭包
# 原则:
# 不修改被装饰函数的源代码(开放封闭原则)
# 为被装饰函数添加新功能后,不修改被修饰函数的调用方式
# import time
# # 获取当前时间
# print(time.time())
2.高阶函数
# 高阶函数定义:
# 1).函数接收的参数是一个函数名
# 2).函数的返回值是一个函数名
# 3).满足上述条件任意一个,都可称之为高阶函数
def test01():
time.sleep(0.5)
print(111)
def test02(func):
start_time = time.time()
func()
end_time = time.time()
print("函数的运行时间:%s" % (end_time - start_time))
return func
test01 = test02(test01)
test01()
# test01被调用了2次,所以简单的高阶函数是实现不了装饰器的
3.函数的嵌套
函数中调用函数不是函数的嵌套,函数中定义另外一个函数才是函数的嵌套
def father(name):
print('from father %s' % name)
def son():
print('from son')
def grandson():
print('from grandson')
grandson()
# locals 当前层的局部变量
print(111111111111, locals(), 22222222222222222)
son()
father('林海峰')
4.闭包
# 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
def father(name):
def son():
# name='alex'
print('我爸爸是 [%s]' % name)
def grandson():
# name='wupeiqi'
print('我爷爷是 [%s]' % name)
grandson()
son()
father('林海峰')
5.函数闭包扩展
# 参考资料:https://www.cnblogs.com/Lin-Yi/p/7305364.html
6.装饰器 + @ 语法糖
# 组成闭包: 1) 2) 3)
# 函数嵌套:decr中嵌套decr2
# 高阶函数:函数的返回值是一个函数名
def decr(func):
def decr2(): # 1)在一个外函数中定义了一个内函数
func() # 2)内函数里运用了外函数的临时变量
return decr2 # 3)并且外函数的返回值是内函数的引用
1)计算函数的运行时间的装饰器
def timmer_opr(func):
def timmer_in(**kwargs):
start_time = time.time()
res = func(**kwargs)
end_time = time.time()
print("函数的运行时间:%s" % (end_time - start_time))
return res
return timmer_in
2)装饰器加上返回值
@timmer_opr
def test04(**kwargs):
time.sleep(1)
print("test04的运行结果")
return "这里是test04的返回值name=%s age=%s height=%s" % (kwargs['name'],
kwargs['age'], kwargs.get('height') or '')
# @语法糖
# test04 = timmer_opr(test04) # 这里可以替换成@timmer_opr
3)装饰器加上参数
res1 = test04(**{'name': 'pca', 'age': 18})
print(res1)
res2 = test04(**{'name': 'pca', 'age': 18, 'height': 19})
print(res2)
4)给装饰器加参数
def timmer_opr_out(params):
def timmer_opr5(func):
def timmer_in(**kwargs):
start_time = time.time()
res = func(**kwargs)
end_time = time.time()
print("test05函数的运行时间:%s %s" % ((end_time - start_time), params))
return res
return timmer_in
return timmer_opr5
@timmer_opr_out("这里是装饰器加参数")
def test05():
time.sleep(0.1)
print("test05的运行结果")
res3 = test05()
print(res3)
6.解压序列
1)同时定义多个变量
a, b, c = [1, 2, 4]
print(a, b, c) # 1 2 4
2)获取列表的第一个和最后一个元素
ages = [1, 2, 3, 4, 5, 6, 7]
m, *_, n = ages # m是第一个值,n是最后一个值,_是中间的值,这里不一定要写_,可以是随便的变量
print(m, n, _) # 1, 7 [2, 3, 4, 5, 6]
3)2个值交换
x, y = 1, 2
x, y = y, x
print(x, y) # 2 1
参考资料:https://www.cnblogs.com/linhaifeng/articles/6140395.html
人工智能系列-Python系列(八)装饰器 = 高阶函数+函数嵌套+闭包