python学习篇之【简易装饰器】
一、装饰器简介
1、什么是装饰器
装饰器本质就是函数,为其他函数添加附加功能
2、原则:
(1)、不修改被修饰函数的源代码
(2)、不修改被修饰函数的调用方式
开放封闭原则,程序上线后,就不应该更改内部源代码。
3、装饰器知识储备
装饰器 = 高阶函数 + 函数嵌套 + 闭包
高阶函数:
(1)、函数接收的参数是一个函数名
(2)、函数的返回值是一个函数名
(3)、满足以上任意一个条件,都可以称之为高阶函数
函数嵌套:
(1)、函数中调用另一个函数
(2)、函数中嵌套函数
闭包:
#闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
#应用领域:延迟计算(原来我们是传参,现在我们是包起来)
二、尝试写一个装饰器
# 练习:尝试使用高阶函数来完成功能 import time # 第一种 # def foo(): # # 原有的函数功能 # time.sleep(2) # print('from foo~') # return # # def timer(func): # # 高阶函数之参数为函数名 # star_time = time.time() # func() # stop_time = time.time() # print("函数的运行时间为 %s" %(stop_time - star_time) ) # # timer(foo) # 这种可以实现,但是更改了函数的运行方式 # # 第二种 # def foo(): # # 原有的函数功能 # time.sleep(2) # print('from foo~') # return # # def timer(func): # # 高阶函数之参数为函数名and返回值也是函数 # star_time = time.time() # func() # stop_time = time.time() # print("函数的运行时间为 %s" % (stop_time - star_time)) # return func # foo = timer(foo)# 这种虽然没有更改调用方式,也算是实现了,但是 该功能函数被调用了两次。 # foo() # 练习:尝试融合使用 # import time # def timer(func): # def wapper(*args,**kwargs): # *args 接收位置参数,**kwargs 接收关键字参数name= ""。 # star_time = time.time() # res = func(*args,**kwargs) # 就是在运行test() 参数怎么接收的怎么传入 # stop_time = time.time() # print('函数的运行时间是%s '%(stop_time-star_time)) # return res # return wapper # res = timer() # 执行的 其实就是 wapper 因为timer的 return值是 wapper # @timer # def foo(): # time.sleep(2) # print("来自foo~") # # foo() # # 如果foo 加参数 # # def foo(name,age): # time.sleep(2) # print("来自foo~") # print('我是 %s,我的年纪是%d。'%(name,age)) # return # # foo('吴克群',40) # 补充,解压序列 # 1、不使用索引,拿到列表首尾的值 与 去除首尾后的值 # li = [1,2,3,4,5,6,7,8] # a,*_,c = li # 拿列表的第一位 和最后一位 # print(a,c) # a,*d,c = li # 拿到去除首尾 中间的值。 *后面只是用于接收参数的变量。 # print(d) # 2、变量交换 # a = 1 # b = 2 # a, b = b, a # 就等于把a的值给b,b的值给a

浙公网安备 33010602011771号