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
练习

 

 

 

 

 

posted @ 2022-04-10 23:02  变靓  阅读(38)  评论(0)    收藏  举报