第一章 Python基础入门之装饰器详解以及案例解析

系列文章目录

第一章 Python基础入门之Hello World
第一章 Python基础入门之变量与数据类型
第一章 Python基础入门之ASCII(字符编码和二进制)
第一章 Python基础入门之单多行的注释和输出
第一章 Python基础入门之INPUT用户输入
第一章 Python基础入门之IF ELSE条件判断
第一章 Python基础入门之While循环与For循环
第一章 Python基础入门之什么是模块(库)
第一章 Python基础入门之什么是.pyc
第一章 Python基础入门之数据类型
第一章 Python基础入门之Python3数据类型中的bytes和str的区别
第一章 Python基础入门之文件读与写详解
第一章 Python基础入门之文件修改详解
第一章 Python基础入门之文件的with语句
第一章 Python基础入门之函数与函数式编程
第一章 Python基础入门之函数式编程参数详解
第一章 Python基础入门之局部变量与全局变量作用域
第一章 Python基础入门之递归和高阶函数



前言

Python系列学习


一、相关内容

什么是装饰器?

装饰器本质是函数,目的是装饰其他函数,即为其他函数添加附加功能。
遵循的原则是:

  • 不能修改被修改装饰的函数的源代码
  • 不能修改被装饰的函数的调用方式
    如下简单示例:
def logger():
    print('logging')

def test1():
    pass
    logger()

def test2():
    pass
    logger()

装饰器应用详解

实现装饰器需要进行以下三点知识储备:

  • 函数即“变量”,有时候函数也相当于变量
  • 高阶函数
  • 嵌套函数
    通常上,高阶函数+嵌套函数 => 装饰器。
import time

def timmer(func):
    def warpper(*args,**kwargs):
        start_time=time.time()
        func()
        stop_time=time.time()
        print("func函数运行了:%s 秒" %(stop_time-start_time))
    return warpper

@timmer
def test1():
    time.sleep(3)
    print('in the test1')

test1()

装饰器之函数即变量

函数即“变量”,有时候函数也相当于变量。

# 情况1
# def foo():
#     print('in the foo')
#     bar()                  #因函数bar未定义,所以会报错
# foo()

# 情况2
# def bar():
#     print('in the bar')

# def foo():
#     print('in the foo')
#     bar()                   #函数bar已定义,作为变量
# foo()

# 情况3
def foo():
    print('in the foo')
    bar()                    #函数bar已定义,作为变量。定义bar()顺序可以在定义foo()后面及调用foo()之前。

def bar():
    print('in the bar')

foo()

# 情况4
# def foo():
#     print('in the foo')
#     bar()
# foo()
#
# def bar():                #bar函数的定义在调用之后,会报错
#     print('in the bar')

高阶函数

高阶函数简单的可以理解成函数里面再嵌套函数。

  • 把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码的情况下为其附加功能)。
  • 返回值中包含函数名。
# 高阶函数-情况1:(把一个函数名当做实参传给另外一个函数)
def bar():
    print('in the bar')

def test1(func):
    print(func)
    func()

test1(bar)
# 注:bar()、test1()有括号的都是代表调用。而bar、test1没有括号,代表“门牌号”,显示出来就是
# bar的内存地址。然后func=bar,再通过func()调用以及打印。逻辑大体如下:
def bar():
    print('in the bar')

def foo():
    print('in the foo')
    bar()
foo()

# 高阶函数-情况2:(把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码的情况下为其附加功能))
import time
def bar():
    time.sleep(3)
    print('in the bar')

def test2(func):
    start_time=time.time()
    func()   #run bar
    stop_time=time.time()
    print('the func run time is %s' %(stop_time-start_time))   #附加计算功能
test2(bar)

# 高阶函数-情况3:(返回值中包含函数名(不修改函数的调用方式))
import time
def bar():
    print('in the bar')

def test3(func):
    print(func)    # 2、打印bar的内存地址,func=bar
    func()         # 3、调用bar(),即调用(打印)bar的返回值“in the bar”
    return func   # 4、返回值,func=bar,故也是返回bar的内存地址--------返回值中包含函数名

t=test3(bar)     # 1、实参bar赋给形参func
print('打印返回值:',t)    # 5、打印test3的返回值

嵌套函数

# 嵌套函数-情况1
def foo():
    print('in the foo')
    def bar():       # 1、此处的bar函数相当于局部变量(上两课的bar函数相当于全局变量)
        print('in the bar')
    bar()            # 2、作为局部变量时,调用时要注意书写位置
foo()
#注:嵌套函数的定义是:嵌套函数是指在一个函数的函数体中使用def声明一个函数,而不是调用函数
# (即在函数体中必须有def,才算是嵌套函数!!!) 。

高阶函数+嵌套函数 => 装饰器

x=0
def grandpa():
    x=1
    def dad():
        x=2
        def son():
            x=3
            print(x)
        son()
    dad()
grandpa()

需求案例解析

需求如下:

  • 有两个函数,都有自己的逻辑,各自实现功能,在实现功能的过程需要消耗时间,从而写一个装饰器来统计这两个函数的运行时间。
import time

# 定义一个嵌套函数
def timeer(func):    #相当于timeer(test1)和timeer(test2)   func=test1和func=test2
    def deco():
        start_time=time.time()
        func()
        stop_time=time.time()
        print('the func run time is %s' %(start_time-stop_time))
    return deco

@timeer              #相当于test1=timeer(test1)
def test1():
    time.sleep(3)
    print('in the test1')

@timeer              #相当于test2=timeer(test2)
def test2():
    time.sleep(3)
    print('in the test2')

# 最后再调用两个函数
test1()
test2()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值